在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;
}
四、测试结果