编程词典
明日图书
明日软件
用户注册
用户登录
站内
  当前位置:编程词典服务网 >> 编程词典社区论坛 >> 使用CFileFind类进行文件...
  · 使用CFileFind类进行文件查找

用户:  大麦
发帖:  430 篇
作品:  0 个
回复:  108 篇
技术分:  1156 分
等级:  
注册:  2010-05-11 09:09:40



发表于:2010-07-13 13:59:04
          楼主

使用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所示。
 
图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所示。
 
图2  CFileFind类文件查找

 

本帖赏分:0 分   回复数:0 篇     
修改   删除   引用   回复
该帖暂无回复!
吉林省明日科技有限公司提供技术支持. 
Copyright © 1999-2008 吉林省明日科技有限公司. 吉ICP备10002740
当前时区 GMT+8, 今天是 
刷新页面 - 关于我们 - 设为首页