#include "StdAfx.h"
#include "FindFile.h"
//这里只是测试函数
//一般我们遍历文件都是有目的 同这个写类似病毒一些东西
void Test(WIN32_FIND_DATA *fd)
{
MessageBox(0,fd->cFileName,0,0);
}
BOOL FindFile(char *pFileName, char * FindFileType)
{
WIN32_FIND_DATA fd;
HANDLE hFind;
char Type[10]={0};
sprintf(Type,".%s",FindFileType);
//HANDLE hFindType;//查找对应文件类型
char FileName[260]={0};
sprintf(FileName,"%s\\*.*",pFileName);
ZeroMemory(&fd,sizeof(fd));
if(0 == strlen(FileName))
{
MessageBox(0,"文件名不能为空",0,0);
return FALSE;
}
else
{
hFind = FindFirstFile(FileName,&fd);
if(INVALID_HANDLE_VALUE==hFind)
{
return FALSE;
}
else
{
do
{
//查找文件名字中有没与 .文件后缀 注意要加点 因为点在文件名字是特殊符号
//一般是不可以用的。但可以用特殊方法来添加。
//U 盘免疫就是用这中方法来 来建立一个不能用普通方法删除autorun.inf的文件夹
if(strstr(fd.cFileName,Type))
{
Test(&fd);
}
else
{
//当该文档是文件时候进行下列操作
if(fd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
//除掉 . 表示当前目录 和..上一个目录 这个在dos 中可以看到
if(strcmp(fd.cFileName,".")!=0&&strcmp(fd.cFileName,"..")!=0)
{
char Temp[256]={0};
sprintf(Temp,"%s\\%s",pFileName,fd.cFileName);
FindFile(Temp,FindFileType);
}
}
}
//继续查找下一个文件
} while (FindNextFile(hFind,&fd));
}
}
re
int findFiles(string path, string extension, vector
{
long hFile=0L;
_finddata_t fileInfo;
string p;
if((hFile=_findfirst(p.assign(path).append("/*").c_str(),&fileInfo))!=-1L)
{
do
{
if(fileInfo.attrib & _A_SUBDIR)
{
if(strcmp(fileInfo.name,".") && strcmp(fileInfo.name,".."))
findFiles(p.assign(path).append("\\").append(fileInfo.name), extension, files);
}
else
{
if(matchExtension(fileInfo.name, extension))
{
string value = p.assign(path).append("\\").append(fileInfo.name);
files.push_back(value);
}
}
}
while(_findnext(hFile, &fileInfo)==0);
_findclose(hFile);
}
return files.size();
}
虽然使用了C++中的string类和vector类,不过核心是io.h中的_findfirst()和_findnext()函数,C语言中用char[]和char*[]代替就可以了,只不过要加一些内存管理的代码不容易让你看清程序的执行方法。
这是一个递归的函数,参数是初始目录,扩展名(如.txt),返回文件路径的vector,返回值是找到的总文件数。
这个函数遍历当前目录下的所有目录和文件,如果是目录(且不是.和..),就调用自己去遍历子目录,并返回得到的文件加入结果。如果是文件去匹配扩展名,相同就加入结果。以此类推。
对了,匹配扩展名的函数是:
bool matchExtension(string fileName,string extension)
{
char *str = (char *) malloc(extension.length()+1);
char *ext = (char *) malloc(getExtension(fileName).length()+1);
strcpy(str,extension.c_str());
strcpy(ext,getExtension(fileName).c_str());
bool isMatch = false;
char *p = strtok(str,"|");
while(p && !isMatch)
{
if(strcmp(ext,p)==0) isMatch=true;
p = strtok(NULL,"|");
}
free(str);
free(ext);
return isMatch;
}