问题描述
请我发现很难递归获取目录中的所有文件。我的代码工作正常,只是它仅获取当前目录中的文件。请任何人帮助我查看我的代码,以检查我做错了什么。
这是我的代码:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
int list2() {
TCHAR currentdir[MAX_PATH];
WIN32_FIND_DATA findDat2;
GetCurrentDirectory(MAX_PATH,currentdir);
strcat_s(currentdir,strlen(currentdir)+strlen("\\*")+1,"\\*");
HANDLE hFind2 = FindFirstFile(currentdir,&findDat2);
if (hFind2 == INVALID_HANDLE_VALUE) {
printf("INVALID HANDLE VALUE");
}
else {
INT dot1 = strncmp(".",findDat2.cFileName,strlen("."));
INT dot2 = strncmp("..",strlen(".."));
do {
if (dot1 !=0 && dot2 != 0) {
if (findDat2.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
SetCurrentDirectory(findDat2.cFileName);
list2();
}
else {
printf("%s\n",findDat2.cFileName);
}
}
} while (FindNextFile(hFind2,&findDat2));
}
}
int list(CHAR *startDir) {
WIN32_FIND_DATA findDat;
TCHAR path[MAX_PATH];
TCHAR cpstartDir[MAX_PATH];
strcpy_s(cpstartDir,sizeof(cpstartDir),startDir);
HANDLE hFind = FindFirstFile(startDir,&findDat);
if (hFind == INVALID_HANDLE_VALUE) {
printf("INVALID_HANDLE_VALUE with finding file\n");
return 0;
}
else {
INT dot1 = strncmp(".",findDat.cFileName,strlen(".."));
do {
if (dot1 !=0 && dot2 != 0) {
if (findDat.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
SetCurrentDirectory(findDat.cFileName);
list2();
}
else {
printf("%s\n",findDat.cFileName);
}
}
} while (FindNextFile(hFind,&findDat));
}
}
int main() {
list("C:\\*.*");
return 0;
}
这只会获取当前目录中的文件
解决方法
您需要的是一个递归函数,该函数递归到找到的每个目录中(.
和..
除外)。
我看不到使用SetCurrentDirectory
的意义。您不想更改工作目录,而只需要较低级别路径的内容。
因此list
应该为每个子目录调用其自身,其参数为:父路径+ \
+子文件夹的名称。
我创建了一个跨平台开源库来遍历整棵树:https://github.com/brechtsanders/libdirtrav 也许这对您很有用,这样您就不必重新发明一切。