Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用FindFirstFile api的Windows 10 C通配符目录搜索失败_C_Windows_Winapi_Directory_File Search - Fatal编程技术网

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

使用FindFirstFile api的Windows 10 C通配符目录搜索失败,c,windows,winapi,directory,file-search,C,Windows,Winapi,Directory,File Search,这是我的代码: #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"

这是我的代码:

#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;
}
#包括
#包括
#包括
#包括
void filesearch(char*path,char*fname);
int main()
{
文件搜索(“C:\\Users\\Admin Local\\Documents”、“test.txt”);
智力选择;
char文件夹[80],fname[80];
printf(“\n我将在哪个目录中搜索?”);
获取(文件夹);
printf(“\n所需文件的文件名是什么?”);
获取(fname);
文件搜索(文件夹,fname);
}
void filesearch(char*文件夹,char*fname){
字符路径[80];
句柄文件句柄;
WIN32_查找_数据ffd;
strcpy(路径、文件夹);
strcat(路径“\\*”);
//printf(“%s\n”,路径);
filehandle=FindFirstFile(路径和ffd);
做{
if(ffd.dwFileAttributes和文件属性目录){
if(strcmp(ffd.cFileName,“.”=0){
FindNextFile(filehandle,&ffd);
继续;
}
字符子路径[80];
strcpy(子路径,文件夹);
strcat(子路径“\\”;
strcat(子路径,ffd.cFileName);
文件搜索(子路径,fname);
继续;
}
if(strcmp(ffd.cFileName,fname)==0)
printf(“\n%s\\%s\n”,文件夹,ffd.cFileName);
}while(FindNextFile(filehandle,&ffd)!=0);
FindClose(文件句柄);
返回;
}
当我放置一个目录,如: C:\Users\Admin Local\Documents和通配符*.txt 什么也没发生。 程序突然停止,windows显示错误并退出

然而,当我提出: C:\Users\Admin Local\Documents和文件名test.txt 它应该输出什么

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

测试调用工作正常


代码中是否存在任何问题,或者这是一个反病毒问题,最重要的是,如何修复它?

第一个问题是,所有80个字符的缓冲区都太小,无法进行安全搜索。它们应至少替换为
char folder[\u MAX\u PATH]
和类似文件。那么主要问题是:

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


使用requires
#include
并链接到
shlwapi.lib
strcmp
将无法识别通配符。未经测试,此程序不会运行
C:\Users\Admin Local\Documents\..\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。当遇到
时,代码将连续运行两次
FindNextFile
迭代,这恰好跳过了
”。“
。我得到了shlwapi.h,但找不到shlwapi.lib。在codeblocks mingw version 20.03中哪里可以找到它?@debanshudas您可以参考thread。您好,如果这个答案确实对您有帮助,请随时标记它以帮助有相同问题的人。
    if(strcmp(ffd.cFileName,fname)==0)
        printf("\n%s\\%s\n",folder,ffd.cFileName);
    if(PathMatchSpec(ffd.cFileName,fname))
        /* ... */