Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 递归地获取硬盘中的所有文件_C_Windows - Fatal编程技术网

C 递归地获取硬盘中的所有文件

C 递归地获取硬盘中的所有文件,c,windows,C,Windows,我发现递归地获取目录中的所有文件很困难。我的代码运行良好,只是它只获取当前目录中的文件。请任何人都应该帮助我查看我的代码,以检查我做错了什么 这是我的密码: #include <windows.h> #include <stdio.h> #include <tchar.h> int list2() { TCHAR currentdir[MAX_PATH]; WIN32_FIND_DATA findDat2; GetCurrentDir

我发现递归地获取目录中的所有文件很困难。我的代码运行良好,只是它只获取当前目录中的文件。请任何人都应该帮助我查看我的代码,以检查我做错了什么

这是我的密码:

#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("..", findDat2.cFileName, 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("."));
        INT dot2 = 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;
}
#包括
#包括
#包括
int list2(){
TCHAR currentdir[MAX_PATH];
WIN32_FIND_DATA findDat2;
GetCurrentDirectory(最大路径,currentdir);
strcats(currentdir,strlen(currentdir)+strlen(“\\*”)+1,“\\*”);
HANDLE hFind2=FindFirstFile(currentdir和findDat2);
if(hFind2==无效的句柄值){
printf(“无效句柄值”);
}
否则{
INT dot1=strncmp(“.”,findDat2.cFileName,strlen(“.”);
INT dot2=strncmp(“..”,findDat2.cFileName,strlen(“..”);
做{
如果(dot1!=0&&dot2!=0){
if(findDat2.dwFileAttributes和文件属性目录){
SetCurrentDirectory(findDat2.cFileName);
列表2();
}
否则{
printf(“%s\n”,findDat2.cFileName);
}
}
}while(FindNextFile(hFind2和findDat2));
}
}
整型列表(字符*起始字符){
WIN32_FIND_DATA findDat;
TCHAR路径[最大路径];
TCHAR cpstartDir[最大路径];
strcpy_s(cpstartDir、sizeof(cpstartDir)、startDir);
HANDLE hFind=FindFirstFile(startDir和findDat);
if(hFind==无效的句柄值){
printf(“查找文件的句柄值无效\n”);
返回0;
}
否则{
INT dot1=strncmp(“.”,findDat.cFileName,strlen(“.”);
INT dot2=strncmp(“..”,findDat.cFileName,strlen(“..”);
做{
如果(dot1!=0&&dot2!=0){
if(findDat.dwFileAttributes和文件属性目录){
SetCurrentDirectory(findDat.cFileName);
列表2();
}
否则{
printf(“%s\n”,findDat.cFileName);
}
}
}while(FindNextFile(hFind和findDat));
}
}
int main(){
列表(“C:\\*.*);
返回0;
}

这只获取当前目录中的文件

您需要的是一个递归函数,该函数递归到找到的每个目录中(除了


我看不出使用
SetCurrentDirectory
有什么意义。您不想更改您的工作目录,而是只需要较低级别路径的内容

因此,
list
应该为每个子目录调用自己,参数为:父路径+
\
+子文件夹的名称

我创建了一个跨平台的开源库来遍历整个树:
也许这对您很有用,这样您就不必重新设计一切。

运行它时的输出是什么?1)检查
Get/SetCurrentDirectory
的返回值。2) 在递归调用之前更改当前目录,但在调用之后从不恢复它。3)
dot1/2
比较应该在整个字符串上进行,而不仅仅是第一个
1/2
字符,因为允许有效的目录名以点开头。@spartygw它只显示硬盘上的文件(C:\),我希望它能获得文件夹中的所有文件,并且每个进程都有子目录
SetCurrentDirectory
(非螺纹)。要实现一个涉及
SetCurrentDirectory
@IInspectable的健壮解决方案是完全不可能的。解决此问题的最佳方法是什么?对用户提供的数据进行递归实现是保证堆栈溢出的一个机会。我不知道如何在没有递归的情况下遍历树。但是,是的,总会有一个最大值在出现堆栈/内存问题之前,对树的最大大小进行限制。我很确定,如果不使用递归实现,树就可以正常运行。@IInspectable如果不使用递归实现,您怎么可以拥有递归\u目录\u迭代器?名称本身就意味着它使用递归。即使它不是使用递归实现的函数它仍然需要为每一个更深层的层次在堆栈上推送内容,因此递归的风险仍然存在,但只适用于嵌套极深的树。我相信如果您感兴趣,您会发现任何数量的实现。但是,宣传自己实现的人可能已经做了这项研究在内存中存储临时状态与在堆栈上编码临时状态的区别在于,与堆栈内存相比,freestore内存的可用量非常大,这在线程创建时是非常有限和固定的。