### 使用递归函数实现指定目录下的文件查找

在设计一个应用软件时，有时需要在某一个目录下查找指定的文件。例如，我们设计一个删除临时文件的程序，首先需要查找磁盘中的临时文件，然后才能进行删除操作。在进行文件查找时，由于文件可能位于某一个目录的子目录下，因此只通过遍历一个目录是无法完成文件查找的。如图 1 描述了这种情况。

而 SetStart.bat 文件位于 C:\MASM32\BIN 目录下，我们不能通过只查找 C:\MASM32 目录而忽略了子目录。

图 1 查找文件

因此，我们在查找一个文件时，一定要遍历目录下的所有子目录，而不能遗漏了任何一个目录。

通过上面的描述，我们可以发现实现文件查找最简单的方法就是使用递归函数。在递归函数中包含有查找的目录和目标文件，首先遍历当前目录下的文件，如果文件是一个目录，则以该目录为参数继续递归调用。这样就可以遍历一个目录下的所有子目录了。下面我们来介绍实例的设计过程。

（1）单击“File/New”菜单项，打开新建窗口，选择 Projects 选项卡，如图 2 所示。

图 2 新建窗口

（2）在工程列表中选择“Win32 Console Application”选项，表示创建控制台应用程序，在 Project name 编辑框中设置工程名称，在 Location 编辑框中设置工程路径。单击“OK”按钮创建工程。

（3）引用 io.h 和 string.h 头文件。

#include <io.h>

#include <string.h>

（4）定义递归函数，实现文件查找。

#define MAXLEN 1024 //定义最大目录长度

bool ListDir(const char* pchData, const char *pszDesFile) //定义递归函数

{

_finddata_t fdata;

long done;

char tempdir[MAXLEN]={0}; //定义字符数组，记录临时文件目录

strcat(tempdir,pchData);

strcat(tempdir , "\\*.*"); //在目录结尾添加\*.*

static bool bRet = false; //定义一个静态变量记录查找结果

done = _findfirst(tempdir, &fdata); //开始查找文件

if (done != -1) //文件查找操作成功

{

int ret = 0;

while (ret != -1) //继续查找下一个文件

{

if (fdata.attrib != _A_SUBDIR) //如果文件不是目录

{

if (strcmp(fdata.name,"...") != 0 &&

strcmp(fdata.name,"..") != 0 &&

strcmp(fdata.name,".") != 0) //不是.文件

{

char dir[MAXLEN]={0};

strcat(dir,pchData);

strcat(dir,"\\");

strcat(dir,fdata.name); //获取完整的文件名

if (stricmp(fdata.name, pszDesFile)==0) //比较文件

{

printf("找到文件，完整路径：%s\n",dir);

bRet = true; //找到文件

return bRet;

}

}

}

ret = _findnext(done,&fdata); //查找下一个文件

if (fdata.attrib == _A_SUBDIR && ret != -1) //文件是一个目录

{

if (strcmp(fdata.name,"...") != 0 &&

strcmp(fdata.name,"..") != 0 &&

strcmp(fdata.name,".") != 0) //文件不是.

{

char pdir[MAXLEN]= {0};

strcat(pdir,pchData);

strcat(pdir , "\\");

strcat(pdir,fdata.name);

ListDir(pdir, pszDesFile); //递归遍历该目录

}

}

}

}

return bRet;

}

提示：我们在使用_findfirst 函数查找一个目录下的文件时，目录字符串应以“\*.*”结尾。

（5）在 main 函数中调用 ListDir 函数查找文件。

int main(void)

{

bool bFind = ListDir("c:\\masm32", "SetStart.bat"); //查找文件

if (!bFind) //是否找到文件

{

printf("没有发现文件!\n");

}

return 0;

}

运行程序，效果如图 3 所示。

图 3 运行结果