这是一个介绍MFC中CFileFind类的小程序。编写这个程序使用的编辑软件是VS2022,基于C++空项目。在C++空项目下要调用MFC类需要:首先,头文件要包含<afx.h>,这个头文件包含了绝大部分使用MFC所需头文件;其次,在项目属性中选用MFC类库(项目属性->配置属性->高级:选用MFC静态库)并把字符集选为“多字符集”。显示方式仍是控制台窗口。
说到CFileFind类,它是MFC中关于文件操作(含目录,目录是特殊的文件,下面内容中不区分文件和目录,统一称作文件)的一个很重要的类,封装了关于文件查找、遍历的多种操作。提到MFC的类,常见的操作手法是通过类对象调用其成员函数完成相关操作,这个CFileFind类也不例外。下面,就CFileFind类使用的一般步骤介绍如下:
1、声明CFileFind对象
声明方式:CFileFind myFind;
2、开始查找函数FindFile
函数调用方式: myFind.FindFile(); //参数 全路径名,可以使用通配符
结合下一步骤函数FindNextFile()名字,可能会误以为FindFile这一步骤已将找到的第一个文件的信息保存到myFind中,实际上没有。这一步骤可以理解成是查找文件工作的初始化。FindFile函数有返回值,BOOL类型,初始化成功返回TRUE,失败返回FALSE。
3、查找下一个文件FindNextFile()
函数调用方式: myFind.FindNextFile( ); //无参
这个函数不能从字面理解,认为它只是和下一个文件相关。实际它的功能分成两块:一是将找到的当前文件的信息存入myFind;二是检查下一个文件的情况,检查结果就是返回值,下个文件存就返回TRUE、不存在则返回FALSE。
4、调用系列Getxxx系列函数获取文件信息
函数调用方式:myFind.GetFileName( ); //获得文件名函数,无参
可以用CString对象接收返回值(文件信息),到这一步才可以得到文件的具体信息。
5、调用系列Isxxx系列函数获取文件属性信息
函数调用方式:myFind.IsDirectory( ); //获得文件是否是目录,无参
返回值为BOOL类型,是目录返回TRUE,不是目录返回FALSE。
6、关闭查找函数Close
调用方式:myFind.Close( ); //无参
关于CFileFind类的使用步骤,大致是上面这些,其中1、2、3、6是彼此匹配依赖出现的,不能漏项。
根据上面的介绍内容,举一个遍历某目录并显示文件名的例子:(有关代码及注释如下)
#include <afx.h>
#include <iostream>
using namespace std;
void myfind(CString path)
{
CString pathStr = path; //将参数传入的CString类型的路径赋值给strPath
pathStr += "/*.*";//合在一起构成"c:/*.*"
CFileFind myFind; //声明文件搜索类对象find
BOOL isFind = myFind.FindFile(pathStr);//开始查找
while (isFind) //如开始查找返回FALSE,则不会进入循环
{
isFind = myFind.FindNextFile();
//返回下一个文件是否存在并将当前文件信息存入myFind对象
CString fileName = myFind.GetFileName(); //获取文件名
CString filePath = myFind.GetFilePath(); //获取文件全路径(含文件名)
if (myFind.IsDirectory() && !myFind.IsDots()) {
cout <<"[" << fileName << "]" << endl;
//如果文件是目录则将文件名(目录名)加上中括号显示
myfind(filePath);
//对函数myFind进行递归调用(如查找到的文件是目录则调用函数自身继续进入目录)
}
else {
cout <<fileName << endl; //如不是目录则显示文件名
}
}
myFind.Close();//关闭CFileFind类对象
}
int main()
{
myfind("c:"); //查找并显示C:目录下的所有文件
system("pause");
return 0;
}
附:一些获取文件信息、文件属性的函数
GetLength 获取找到文件的长度,以字节为单位
GetFileName 获取找到文件的名字
GetFilePath 找到文件的全路径(含文件名)
GetRoot 获取找到文件根目录
GetCreationTime 获取文件创建时间
GetLastAccessTime 获取文件最后一次打开的时间
GetLastWriteTime 文件最后改变和存储的时间
IsReadOnly 文件是否是只读
IsDirectory 文件是否是目录
IsCompressed 文件是否是压缩
IsSystem 文件是否是系统文件
IsHidden 文件是否是具隐藏属性
IsTemporary文件是否是临时的
IsNormal文件是否是常规的(无其它属性)
IsArchived文件是否是档案