MFC利用CFileFind枚举目录下所有文件

最近在写贴吧分布式爬虫系统(https://github.com/ankanch/tieba-zhuaqu)的用户管理端程序。为了保证高度可扩展性,在该程序的数据分析部分,引入了插件机制。这样日后需要拓展功能的时候只需要不断的增加插件(由于插件是python写的,所以我们只需要用C++调用cmd执行python插件就行。如果需要UI,也可以使用python自带的Tkinter实现。)

这样,便通过C++与python结合的方式,完成了用户管理端程序。

该程序所引入的插件机制非常简单,因为插件是用python脚本完成的,所以我们只需要让我们的C++程序找到python脚本,并且执行即可。

这样就涉及到一个问题,那就是如何令MFC程序列举出当前一个子目录下的所有文件。一旦实现这个,我们基本也就完成了插件的加载功能。

还是上网查,查如何解决,在试了一系列的方法后,找到了一个叫做CFileFind类。然后去MSDN查这个类的用法,我们可以发现,MSDN指出:

执行本地文件搜索和是 CGopherFileFind 和 CFtpFileFind的基类,执行Internet文件搜索。

只有一句话,重点是,它可以执行本地文件搜索,比那些Windows API好用多了。

接下来我们讲讲如何使用这个类,从MSDN查询我们可以发现,我们主要需要以下几个函数:

CFileFind::Close

关闭搜索请求。

CFileFind::FindFile

搜索一个目录一个指定的文件名。

CFileFind::FindNextFile

继续以前的文件搜索调用 FindFile。


CFileFind::GetFileName

获取名称,包括扩展,找到的文件

CFileFind::IsDirectory

确定找到的文件是否为内容。

CFileFind::IsDots

确定找到的文件的名称是否具有名称“”。或者“。”,指示实际上是内容。





(内容来源:MSDN:https://msdn.microsoft.com/library/9990068c-b023-4114-9580-a50182d15240.aspx#cfilefind__findfile)

那么如何搜索呢?

根据MSDN上的例子,我们在第一次查找的时候,首先需要给其传入一个路径,指明在哪里查找该文件。

1
2
CFileFind finder;
BOOL bWorking = finder.FindFile(_T(".\\plugins\\*.*"));

然后,我们只需要循环调用FindNextFile(),并判断其返回值是否为false即可。(当为false时,表示已经遍历完当前目录下所有文件,或者出错。如果出错,你需要通过GetLastError()得到错误是啥。)

代码像下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while (bWorking)
{
bWorking = finder.FindNextFile();
if (finder.IsDots())
continue; //跳过..
CString foldername = (LPCTSTR)finder.GetFileName(); //得到文件名
//MessageBox(foldername);
if (finder.IsDirectory())
{
//如果是路径
}
else
{
//如果是文件
}
}

如果是路径呢,大家还可以递归调用FindNextFile知道遍历整个子目录。

以上代码在Visual Studio 2015中编译通过。

参考:MSDN CFileFind类:https://msdn.microsoft.com/library/9990068c-b023-4114-9580-a50182d15240.aspx#cfilefind__findfile

0%