【问题标题】:Windows 10 C Wildcard Directory Search With FindFirstFile api Fails使用 FindFirstFile api 进行 Windows 10 C 通配符目录搜索失败
【发布时间】:2021-01-20 13:44:29
【问题描述】:

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <windows.h>
void filesearch(char* path,char* fname);


int main()
{
    filesearch("C:\\Users\\Admin Local\\Documents","test.txt");
    int choice;
    char folder[80],fname[80];
    printf("\nWhich directory will I search in?    ");
    gets(folder);
    printf("\nWhat is the filename of the required file?     ");
    gets(fname);
    filesearch(folder,fname);
}

void filesearch(char* folder,char* fname){
    char path[80];
    HANDLE filehandle;
    WIN32_FIND_DATA ffd;


    strcpy(path,folder);
    strcat(path,"\\*");
   // printf("%s\n",path);

    filehandle=FindFirstFile(path,&ffd);

    do{
        if(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
            if(strcmp(ffd.cFileName,".")==0){
                FindNextFile(filehandle,&ffd);
                continue;
            }
            char subpath[80];
            strcpy(subpath,folder);
            strcat(subpath,"\\");
            strcat(subpath,ffd.cFileName);
            filesearch(subpath,fname);
            continue;
        }
        if(strcmp(ffd.cFileName,fname)==0)
            printf("\n%s\\%s\n",folder,ffd.cFileName);
    }while(FindNextFile(filehandle,&ffd)!=0);
    FindClose(filehandle);
    return;
}

当我放置一个目录时: C:\Users\Admin Local\Documents 和通配符 *.txt 什么都没发生。 程序突然停止,窗口显示错误并退出。

然而,当我输入: C:\Users\Admin Local\Documents 和文件名 test.txt 它按应有的方式输出。

我在第 10 行对该函数进行了测试调用,这样我就可以检查它是否正常工作,而不必担心用户输入和输入处理中的错误。

测试调用工作正常。

代码中是否有任何问题,或者这是防病毒问题,最重要的是,我该如何解决?

【问题讨论】:

  • strcmp 无法识别通配符。
  • 未测试,这个程序不会去C:\Users\Admin Local\Documents\..\..\..\..\..\..\..\..\..之类的吗?
  • @MikeCAT 实际上不是,要么靠运气,要么靠(冒险的)把戏。当遇到"." 时,代码连续运行两次 FindNextFile 迭代,恰好跳过".."

标签: c windows winapi directory file-search


【解决方案1】:

第一个问题是所有这些 80 个字符的缓冲区对于安全搜索来说都太小了。它们应至少替换为 char folder[_MAX_PATH] 和类似的。那么主要问题如下:

    if(strcmp(ffd.cFileName,fname)==0)
        printf("\n%s\\%s\n",folder,ffd.cFileName);

这会将文件名与通配符进行比较,对于真正的通配符将失败。应该是:

    if(PathMatchSpec(ffd.cFileName,fname))
        /* ... */

使用PathMatchSpec 需要#include &lt;shlwapi.h&gt; 并链接到shlwapi.lib

【讨论】:

  • 我得到了 shlwapi.h 但找不到 shlwapi.lib。在代码块 mingw 版本 20.03 中哪里可以找到?
  • @debanshudas 可以参考this线程。
  • 嗨,如果这个答案对你有帮助,请随时标记它以帮助有同样问题的人。
猜你喜欢
  • 1970-01-01
  • 2020-07-28
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多