Windows 10 使用 FindFirstFile api 的 C 通配符目录搜索失败

Windows 10 C Wildcard Directory Search With FindFirstFile api Fails

这是我的代码:

#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 什么都没发生。 程序突然停止,windows 显示错误并退出。

然而当我输入: C:\Users\Admin Local\Documents 和文件名test.txt 它应该输出。

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

测试调用正常。

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

第一个问题是所有那些 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 <shlwapi.h> 并链接到 shlwapi.lib