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

四、测试结果


相关推荐
小鹭同学_2 分钟前
Java基础 Day20
java·开发语言
风清扬雨7 分钟前
计算机视觉中的可重复性:深入案例分析与Python代码实现
python·opencv·计算机视觉
CodeWithMe8 分钟前
【C/C++】从零开始掌握Kafka
c语言·c++·kafka
五步晦暝16 分钟前
【EcelVBA】系统学习 ActiveX 控件
服务器·windows·学习
@作死星人19 分钟前
C# :HImage转Mat方法
开发语言·c#
繁华似锦respect22 分钟前
libevent2-介绍
linux·服务器·windows
David Bates40 分钟前
代码随想录第42天:图论3
python·并查集
天天进步201543 分钟前
C# Unity容器详解
开发语言·unity·c#
whoarethenext44 分钟前
c/c++的opencv椒盐噪声
c语言·c++·opencv
276695829244 分钟前
开盘啦 APP 抓包 逆向分析
java·python·app抓包·抓包分析·开盘啦