gpt4 book ai didi

c - 在C(Windows)中列出给定路径中的文件夹、子文件夹和文件

转载 作者:行者123 更新时间:2023-11-30 16:56:43 25 4
gpt4 key购买 nike

有没有办法列出给定路径中的所有文件夹、子文件夹和文件?例如:(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);
}

来源: How to recursively list directories in C on LINUX

最佳答案

正如 @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 的示例。

关于c - 在C(Windows)中列出给定路径中的文件夹、子文件夹和文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39830057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com