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
。
这是我的代码:
#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
。