在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 分钟前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
Evand J1 小时前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
LucianaiB1 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
Ronin3051 小时前
11.vector的介绍及模拟实现
开发语言·c++
字节高级特工1 小时前
【C++】深入剖析默认成员函数3:拷贝构造函数
c语言·c++
计算机学长大白2 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
PieroPc3 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
2401_857439696 小时前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php
yutian06066 小时前
Keil MDK下载程序后MCU自动重启设置
单片机·嵌入式硬件·keil
SoraLuna6 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos