列出C中给定路径中的文件夹,子文件夹和文件(Windows)

编码器阿斯克

有没有办法列出给定路径中的所有文件夹,子文件夹和文件?例如:(c:\ myfolder),并为其中包含的每个文件和文件夹打印完整路径?

c:\myfolder\folder1\
c:\myfolder\folder2\
c:\myfolder\folder2\f1
c:\myfolder\folder2\f2\g1
c:\myfolder\test.txt
c:\myfolder\t.txt

我找到了这个示例,但仅针对linux设计:

int is_directory_we_want_to_list(const char *parent, char *name) {
    struct stat st_buf;
    if (!strcmp(".", name) || !strcmp("..", name))
        return 0;

    char *path = alloca(strlen(name) + strlen(parent) + 2);
    sprintf(path, "%s/%s", parent, name);
    stat(path, &st_buf);
    return S_ISDIR(st_buf.st_mode);
}

int list(const char *name) {
    DIR *dir = opendir(name);
    struct dirent *ent;

    while (ent = readdir(dir)) {
        char *entry_name = ent->d_name;
        printf("%s\n", entry_name);

        if (is_directory_we_want_to_list(name, entry_name)) {
            // You can consider using alloca instead.
            char *next = malloc(strlen(name) + strlen(entry_name) + 2);
            sprintf(next, "%s/%s", name, entry_name);
            list(next);
            free(next);
        }
    }

    closedir(dir);
}

来源: 如何在LINUX上以递归方式列出C中的目录

Serge Ballesta

正如@purplepsycho所建议的那样,最简单的方法是使用FindFirstFile,FindNextFile和FileClose。

但是与Unix版本还是有一些区别:您必须搜索像这样的名称,folder\*而不是浏览目录,FindFirstFile给出名字,然后使用来获得其他名称FindNextFile

这是完整的代码示例:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

#ifdef UNICODE
#define fmt "%S"
#else
#define fmt "%s"
#endif

void process_file(LPCTSTR filename) {
    // TODO: implement actual file processing
    printf(fmt, filename);
    fputs("\n", stdout);
}

void process_folder(LPCTSTR foldername) {
    WIN32_FIND_DATA findFileData;
    HANDLE handle;
    LPTSTR newfolder = malloc(sizeof(TCHAR) *(_tcslen(foldername) + 3));  // add some room for the additional \*
    _tcscpy(newfolder, foldername);
    _tcscat(newfolder, _T("\\*"));
    handle = FindFirstFile(newfolder, &findFileData);
    if (handle != INVALID_HANDLE_VALUE) {
        while(1) {
            // skip . and .. to avoid infinite recursion
            if ((_tccmp(findFileData.cFileName, _T(".")) != 0) && (_tccmp(findFileData.cFileName, _T("..")) != 0)) {
                // compute name as folder\filename
                LPTSTR newname = malloc(sizeof(TCHAR) * (_tcslen(foldername) + _tcslen(findFileData.cFileName) + 2));
                _tcscpy(newname, foldername);
                _tcscat(newname, _T("\\"));
                _tcscat(newname, findFileData.cFileName);
                if ((findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
                    process_folder(newname); // recurse if is is a directory
                }
                else {
                    process_file(newname);  // process other files
                }
                free(newname);  // consistenly free any malloc
            }
            if (FindNextFile(handle, &findFileData) == FALSE) break; // exit the loop when folder is exhausted
        }
        FindClose(handle);
    }
    free(newfolder); 
}

int _tmain(int argc, TCHAR *argv[]) {
    if (argc != 2) {
        fputs("Usage: ", stderr);
        fprintf(stderr, fmt, argv[0]);
        fputs(" top_folder\n", stderr);
        return 1;
    }
    process_folder(argv[1]);
    return 0;
}

上面的代码仍然缺少一些错误条件处理,但是是Windows上递归使用Find {First | Next} File的示例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在给定路径中仅列出没有子文件夹的文件夹?

C#文件夹,子文件夹和文件未出现在C#Windows应用程序目录路径比较代码中

如何从文本文件中给定的路径创建文件夹和文件

在我的应用程序的资产目录中列出所有文件和文件夹(以及子文件夹),并检查资产是文件还是文件夹

列出文件夹和子文件夹中的文件,并带有.txt文件的路径

如何列出 Google Drive 根文件夹中的文件和文件夹

列出文件大小给定结构中的所有文件夹和子文件夹

列出目录C +中的文件夹

C#Sharepoint.Client-返回给定子文件夹中的所有文件和文件夹

在msbuild中复制子文件夹和文件

从给定路径删除文件和文件夹

如何在ckfinder中显示所有文件夹,子文件夹和文件

列出R中没有子文件夹的文件夹中的所有文件

命令列出文件夹中的所有文件以及Windows中的子文件夹

列出文件夹和文件

Windows Vista中的链接文件和文件夹

Windows 7中的递归文件和文件夹共享

列出特定文件夹中的文件

如何在Windows 7中仅搜索文件夹而不是文件夹和文件

列出文件夹中的所有文件以及子文件夹

列出文件夹中的所有文件ID(无子文件夹)

gitignore多个文件夹中的给定文件夹

在Powershell中列出给定深度以下的文件夹

在文件路径中查找子文件夹

Powershell 查找给定文件夹名称中的所有空文件夹和子文件夹

删除文件夹中的所有文件和文件夹,以结尾的文件和文件夹为准

列出(仅)文件夹中的子文件夹-Swift 3.0 / iOS 10

PowerShell - 列出 TreeView GUI 元素中的所有文件夹和子文件夹

批处理脚本以在子文件夹中查找文件夹并获取文件夹路径