C 递归搜索文件夹及其子文件夹中的文件

标签 c windows

我的程序正在从用户那里获取输入路径,并且正在查找名称与 .csv 文件中的列相对应的文件,其中 oldpath 是用户输入路径,然后我在 while 循环中使用 get_ Between_delimiter 从 .csv 中每行的第一个单元格中获取我要查找的文件的名称

我不明白的是,如果该文件不存在于基目录中或立即检查该文件的所有子目录,同时保留程序的功能,该如何检查?

  strcpy(oldnp, oldpath);
  strcat(oldnp, "/");
  strcat(oldnp, get_between_delimiter(commande[cnt] , 0));
  strcat(oldnp, ".png");
  source = fopen(oldnp, "r");
  if ((source = fopen(oldnp, "r")) == NULL)
   file_found();
  else
   ;?

最佳答案

使用FindFirstFile列出目录中的所有文件,然后对每个文件进行比较。或者进行递归搜索并搜索每个子目录。

您也可以调整“通配符”。

这个例子在"c:\\test"上查找"something.png",如果没有找到,它会在子目录中查找“c:\\测试”

确保不要对“C:\”进行递归搜索,因为这将遍历驱动器上的所有文件。

#include <stdio.h>
#include <Windows.h>

int findfile_recursive(const char *folder, const char *filename, char *fullpath)
{
    char wildcard[MAX_PATH];
    sprintf(wildcard, "%s\\*", folder);
    WIN32_FIND_DATA fd;
    HANDLE handle = FindFirstFile(wildcard, &fd);
    if(handle == INVALID_HANDLE_VALUE) return 0;
    do  
    {
        if(strcmp(fd.cFileName, ".") == 0 || strcmp(fd.cFileName, "..") == 0) 
            continue;
        char path[MAX_PATH];
        sprintf(path, "%s\\%s", folder, fd.cFileName);

        if(_stricmp(fd.cFileName, filename) == 0) 
            strcpy(fullpath, path);
        else if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            findfile_recursive(path, filename, fullpath);
        if(strlen(fullpath))
            break;
    } while(FindNextFile(handle, &fd));
    FindClose(handle);
    return strlen(fullpath);
}

int main(void)
{
    char fullpath[MAX_PATH] = { 0 };
    if(findfile_recursive("c:\\test", "something.png", fullpath))
        printf("found: %s\n", fullpath);
    return 0;
}

关于C 递归搜索文件夹及其子文件夹中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47306626/

相关文章:

c - 用链表求解 Josephus

c - C 中简单包装函数的用途

linux - Windows 和 Linux 中的 QtMultimedia 包含

Windows 短名称与长名称不匹配

windows - 当存在名为 nul 的文件时,nul 如何工作

R 无法识别命令行选项。 (警告 : unknown option '-d' )

c - 经典书籍 "The C Programming Language"中1.9章的示例代码是否有错误?

c - 在(旧)C 代码中引用 stderr 会产生错误

c - 如何避免 gcc 编译器使用 -l 选项?

java - 无法识别命令行 Ant