使用CFileFind类进行文件查找
MFC提供的CFile类封装了对文件的基本操作,但是没有提供文件查找的功能,而是单独提供了CFileFind类进行文件查找。下面介绍一下CFileFind类的主要方法。
(1)MatchesMask
该方法用于设置查找文件的属性,即只查找复合指定文件属性的文件。
语法:
virtual BOOL MatchesMask( DWORD dwMask ) const;
参数说明:
dwMask:用来指定文件属性,文件属性定义在WIN32_FIND_DATA结构中,其可选值如表1所示。
表1 文件属性
|
值
|
描述
|
|
FILE_ATTRIBUTE_ARCHIVE
|
表示存档文件
|
|
FILE_ATTRIBUTE_COMPRESSED
|
表示文件被压缩
|
|
FILE_ATTRIBUTE_DIRECTORY
|
表示文件是一个目录
|
|
FILE_ATTRIBUTE_NORMAL
|
表示普通文件
|
|
FILE_ATTRIBUTE_HIDDEN
|
表示隐藏文件
|
|
FILE_ATTRIBUTE_READONLY
|
表示只读文件
|
|
FILE_ATTRIBUTE_SYSTEM
|
表示系统文件
|
|
FILE_ATTRIBUTE_TEMPORARY
|
表示临时文件
|
说明:存档属性又称为A属性(Archive),通常是提供给备份软件或备份命令使用的,当用户创建或修改一个文件,存档属性自动被标识,以提示备份软件文档尚未备份,当备份后,存档属性自动取消。如果用户再次修改了文件,存档属性会再次标识,该属性通常应用于Windows95、Windows98和WindowsMe系统中。
(2)GetFileName
该方法用于获取查找的文件名称,包含扩展名,不包含路径。
语法:
virtual CString GetFileName( ) const;
返回值:方法返回查找的文件名称。
(3)GetFileTitle
该方法用户获取文件的名称,去除扩展名,不包含路径。
语法:
virtual CString GetFileTitle( ) const;
(4)GetFilePath
该方法获取文件的完整名称,包括扩展名和完整路径。
语法:
virtual CString GetFilePath( ) const;
(5)GetFileURL
该方法用于获得已查找到文件的网络全路径,对查找本地文件没有实际意义,主要是为继承自CFileFind类的子类提供接口。
语法:
virtual CString GetFileURL( ) const;
(6)GetRoot
该方法用于获取文件所在的路径,不包含文件名。
语法:
virtual CString GetRoot( ) const;
(7)GetCreationTime
该方法用于获取文件的创建时间。
语法:
virtual BOOL GetCreationTime( CTime& refTime ) const;
参数说明:
refTime:表示一个CTime对象,记录文件的创建时间。
(8)IsDots
该方法判断文件夹是否为“.”或“..”。“.”和“..”是两种系统文件夹,“.”代表是文件夹本身,“..”代表是父文件夹。
语法:
virtual BOOL IsDots( ) const;
返回值:如果查找到的是“.”或“..”文件夹,则返回值为1,否则返回值为0。
(9)FindFile
该方法用于开始查找文件,即设置要查找文件的文件名称。
语法:
virtual BOOL FindFile( LPCTSTR pstrName = NULL, DWORD dwUnused = 0 );
参数说明:
pstrName:表示设置要查找文件的文件名,要查找所有文件,可以将此名称设为*.*。
dwUnused:保留,以后用作多态的基类。
返回值:如果成功,返回非零值。
(10)FindNextFile
该法用来查看已查找到文件的下一个文件。此方法是在查找的文件不只是一个的时候使用,即在调用FindFile和FindNextFile后的返回值不是0的情况下使用。
语法:
virtual BOOL FindNextFile( );
返回值:如果成功,返回非零值
下面通过一个示例介绍如何使用CFileFind类进行文件查找。
例如,使用CFileFind类进行文件查找
(1)创建一个基于对话框的工程,工程名称为“FindFile”,设计对话框资源如图1所示。
.jpg)
图1 对话框资源设计窗口
(2)向对话框中添加EnumDisk方法,列举系统磁盘。
void CFindFileDlg::EnumDisk()
{
DWORD dirlen = GetLogicalDriveStrings(0,NULL); //获取字符串长度
HANDLE hp = GetProcessHeap(); //获取进程堆句柄
LPSTR pdir = (LPSTR)HeapAlloc(hp,HEAP_ZERO_MEMORY,dirlen); //在堆中分配空间
LPSTR ptmp = pdir; //定义一个临时指针
GetLogicalDriveStrings(dirlen,pdir); //获取磁盘目录字符串
while (*pdir != 0) //遍历磁盘目录
{
m_Disk.AddString(pdir); //向组合框中添加磁盘名称
pdir = strchr(pdir,0)+1 ; //查找下一个磁盘名称
}
HeapFree(hp,HEAP_NO_SERIALIZE,ptmp); //释放堆空间
}
(3)处理“查找”按钮的单击事件,查找文件。
void CFindFileDlg::OnOK()
{
CString flname,dir,findret; //定义字符串
BOOL result = FALSE; //记录查找结果
m_FileName.GetWindowText(flname); //获取查找的文件名
m_Disk.GetWindowText(dir); //获取搜索目录
if (!flname.IsEmpty() && !dir.IsEmpty()) //判断字符串是否为空
{
CFileFind flFind; //定义文件查找对象
strcat(dir.GetBuffer(0),"*.*"); //填充字符串
flFind.MatchesMask(FILE_ATTRIBUTE_NORMAL); //设置文件查找属性
BOOL ret = flFind.FindFile(dir); //开始查找文件
while(ret) //遍历当前目录
{
if (flFind.IsDots()) //判断是否为.或..目录
continue;
ret = flFind.FindNextFile(); //查找下一个文件
if (ret == TRUE)
{
findret = flFind.GetFileName(); //获取文件名
if (findret == flname) //比较文件名
{
result = TRUE; //发现文件
break; //终止循环
}
}
}
if (result)
{
CString strHint = "发现文件,位于:"; //设置提示字符串
strHint += flFind.GetFilePath(); //设置字符串信息
flFind.Close(); //关闭文件查找
MessageBox(strHint,"提示"); //显示对话框
}
}
}
(4)运行程序,效果如图2所示。
.jpg)
图2 CFileFind类文件查找