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

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

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

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;
}

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

c 复制代码
/* 获取目录中所有内容(包括子目录) */
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);
}

三、主函数测试

C 复制代码
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;
}

四、测试结果


相关推荐
北冥you鱼10 分钟前
Go 语言空接口(interface{})使用场景与最佳实践
开发语言·windows·golang
for_ever_love__12 分钟前
MySQL 全文索引实战:FULLTEXT、ngram 中文分词与 MATCH AGAINST 到底该怎么用
java·python·mysql·全文检索·分词·索引·ngram
用户83562907805118 分钟前
使用 Python 合并 PowerPoint 演示文稿
后端·python
xh didida20 分钟前
Linux -- 基础IO
linux·服务器·开发语言·c++
weixin_4617694031 分钟前
VS Code 中创建 Jupyter 文件(.ipynb)
ide·python·jupyter
不会代码的小猴33 分钟前
启动文件
stm32·嵌入式硬件
深圳老胡39 分钟前
STM32CubeMX 生成 CMake 工程,用 VSCode 编译与调试的完整流程
笔记·stm32·单片机·代码规范
个 人 练 习 生39 分钟前
C++ string 类模拟实现:从底层理解字符串(上)
开发语言·c++·经验分享·学习·程序人生
2601_966949651 小时前
多市场量化策略的数据接口应该如何设计:从数据层架构到策略接入
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
坤坤子吖1 小时前
C++智能指针:RAII、shared_ptr与内存泄漏
开发语言·c++·笔记·学习