使用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))
/* ... */