当前位置: 首页 > article >正文

在Windows下C语言获取当前应用程序运行路径并获取指定目录下所有文件(包括子目录)

在Windows下C语言获取当前应用程序运行路径并获取指定目录下所有文件包括子目录

  • 一、获取当前应用程序运行路径
  • 二、获取指定目录下所有文件(包括子目录)
  • 三、主函数测试
  • 四、测试结果

一、获取当前应用程序运行路径


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <math.h>
#include <errno.h>
#include <dirent.h>


/* 获取应用程序路径 */
static u16 usGet_AppExeDir(u8 * pCurDir, u16 num)
{
    u8 dir[MAX_PATH] = {0};
    u16 x = 0, i = 0, len = GetModuleFileName(NULL, dir, MAX_PATH);
    if (!len) return 0;

    //dir ==> F:\Project\Demo\AlgoVerify\xDemo-AlgoVerify\AlgoVerify.exe
    for (i = len - 1; i > 0; i--) 
    {
        /* 最后一个‘/’为结束符号 */
        if (dir[i] == '\\' || dir[i] == '/') 
        {
            dir[i] = '\0';
            break;
        }
    }

    //pCurDir ==> F:\Project\Demo\AlgoVerify\xDemo-AlgoVerify
    /* 拷贝路径 */
    i = (num > i) ? i : num;
    for (x = 0; x < i; ++x)
    {
        *pCurDir++ = dir[x];
    }

    return i;
}

二、获取指定目录下所有文件(包括子目录)


/* 获取目录中所有内容(包括子目录) */
static void vGet_DirContent_RecurDirSub(const u8 * pDir, u16 * pFileCount, u8 (* pFilesDir)[MAX_PATH], u16 * pMaxCount)
{
    WIN32_FIND_DATA findFileData;
    HANDLE SeekHandler = INVALID_HANDLE_VALUE;  
    u8 seekDir[MAX_PATH] = {0};
    u8 fullDir[MAX_PATH] = {0};


    /* 构造搜索路径,添加"/*"来查找所有文件 */
    snprintf(seekDir, sizeof(seekDir), "%s\\*", pDir);

    /* 获取目录中的第一个文件或子目录 */
    SeekHandler = FindFirstFile(seekDir, &findFileData);
    if (SeekHandler == INVALID_HANDLE_VALUE) return;
    do 
    {
        /* 忽略"."和".."文件目录 */
        if ((!strcmp(findFileData.cFileName, ".")) || (!strcmp(findFileData.cFileName, ".."))) continue;

        /* 构建当前文件或目录的完整路径 */
        snprintf(fullDir, sizeof(fullDir), "%s\\%s", pDir, findFileData.cFileName);

        /* 目录 */
        if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
        {
            /* 递归读取子目录 */
            vGet_DirContent_RecurDirSub(fullDir, pFileCount, pFilesDir, pMaxCount);
        } 
        else 
        {
            if (*pFileCount < *pMaxCount) strcpy(pFilesDir[*pFileCount], fullDir);

            /* 是文件,打印文件路径 */
            *pFileCount += 1;
            printf("%-2u File:%s\r\n", *pFileCount, fullDir);
        }
    } while (FindNextFile(SeekHandler, &findFileData) != 0);

    /* 关闭目录句柄 */
    FindClose(SeekHandler);
}

三、主函数测试

int main(int argc, char *argv[]) 
{
    u16 len = 0, i = 0, max = 0;
    u8  CurExeDir[MAX_PATH] = {0};
    u8  FilesDir[50][MAX_PATH]  = {0};

    len = usGet_AppExeDir(CurExeDir, (sizeof(CurExeDir) / sizeof(CurExeDir[0])));
    if (len)
    {
        printf("Current Application Directory: %s\r\n", CurExeDir);
        strncat(CurExeDir, "\\UI", sizeof("\\UI"));
        printf("Get Directory Content        : %s\r\n", CurExeDir);
        printf("\r\n");

        len = 0; 
        max = sizeof(FilesDir) / sizeof(FilesDir[0]);
        vGet_DirContent_RecurDirSub((const u8 *)CurExeDir, &len, FilesDir, &max);
        if (len)
        {
            printf("\r\n\r\n");
            for (i = 0; i < len; i++)
            {
                printf("%03u/%03u ==> %s\r\n", (i + 1), len, FilesDir[i]);
            }
        }
    }
	
	printf("\r\n\r\n\r\n");
	printf("Compiler Date : %s  %s\r\n", __DATE__, __TIME__);
    while(1);
    return 0;
}

四、测试结果

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d1f9ceeffc7145cdaa31453dcabbf625.png
在这里插入图片描述


http://www.kler.cn/a/428997.html

相关文章:

  • llava 导入process报错
  • 【C++】面试题整理(未完待续)
  • 麒麟操作系统服务架构保姆级教程(十一)https配置
  • 基于本地消息表实现分布式事务
  • 数组常见解决方案
  • 【深入解析】 RNN 算法:原理、应用与实现
  • 决策树:ID3、C4.5和CART特征选择方式
  • Lua使用点号和冒号的区别
  • Selenium是广泛使用的模拟浏览器运行的库
  • 为超越JVM而生?深入理解Kotlin Native的梦想与可能
  • 使用PaddleOCR遇到的问题Bug
  • 机器学习:全面学习路径指南
  • 漫画之家Spring Boot:漫画资源的跨设备访问
  • photoblog解题过程
  • 代码随想录第五十一天
  • 天天 AI-241208:今日热点- OpenAI发布强化微调API,能深度定制超复杂大模型了
  • Linux内核升级操作和 k8s 常见命令
  • Vue3.0中的响应式原理是什么?vue2的响应式原理是什么?
  • LeetCode Hot100 61~70
  • 2024最新qrcode.min.js生成二维码Demo
  • G6基本使用
  • Java项目实战II基于微信小程序的无中介租房系统(开发文档+数据库+源码)
  • Springer Nature——Applied Intelligence 投稿指南
  • JVM学习《垃圾回收算法和垃圾回收器》
  • 知乎Java后台开发面试题及参考答案
  • Vue项目开发 如何实现父组件与子组件数据间的双向绑定?