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

四、测试结果


相关推荐
总结所学19 分钟前
擦除整片flash后,程序下载到单片机,单片机不运行
单片机·嵌入式硬件
香蕉可乐荷包蛋35 分钟前
Python面试问题
开发语言·python·面试
小柒的博客42 分钟前
联合体union的特殊之处
c语言·机器人
ErizJ44 分钟前
Golang|分布式索引架构
开发语言·分布式·后端·架构·golang
.生产的驴1 小时前
SpringBoot 接口国际化i18n 多语言返回 中英文切换 全球化 语言切换
java·开发语言·spring boot·后端·前端框架
界面开发小八哥1 小时前
智能Python开发工具PyCharm v2025.1——AI层级功能重磅升级
ide·人工智能·python·pycharm·开发工具
八股文领域大手子1 小时前
深入浅出限流算法(三):追求极致精确的滑动日志
开发语言·数据结构·算法·leetcode·mybatis·哈希算法
donglxd1 小时前
老电脑优化全知道(包括软件和硬件优化)
运维·windows·系统安全
啊阿狸不会拉杆1 小时前
人工智能数学基础(一):人工智能与数学
人工智能·python·算法
2401_888859711 小时前
STM32 ADC模数转换器
stm32·单片机·嵌入式硬件