CFileFind类

CFileFind类的使用总结
2007-7-7
1、CFileFind类的声明文件保存在afx.h头文件中。
2、该类的实现的功能:执行本地文件的查找(查找某个具体的文件,查找某类文件x*.x*,查找所有文件*.*)
3、CFileFind类是CGopherFileFind和CFtpFileFind类的基类。
4、CFileFind类的构造函数::CFileFind()和关闭函数::Close()我会成对使用。
5、CFileFind类的成员函数我根据其操作特性划分为3类:查找操作类、获得文件属性类、判断文件属性类。(下面我先进行函数罗列并没有完整的描述函数的参数)
查找操作类
      ::FindFile();
      ::FindNextFile();
获得文件属性类
      ::GetCreationTime();
      ::GetLastAccessTime();
      ::GetLastWriteTime();
::GetFileName();
::GetRoot();
      ::GetFilePath();
      ::GetFileTitle();
      ::GetFileURL();
      ::GetLength();
     
判断文件属性类
      ::IsArchived();
      ::IsCompressed();
      ::IsDirectory();
      ::IsDots();
      ::IsHidden();
      ::IsNormal();
      ::IsReadOnly();
      ::IsSystem();
      ::IsTemporary();
      ::MatchesMask();
6、CFileFind类中成员函数使用应注意的顺序
      在创建了CFileFind对象后,先执行::FindFile()函数,然后执行::FindNextFile(),然后选择执行(获得文件属性类)的函数或者(判断文件属性类)函数。
7、CFileFind类成员函数的详细分析
virtual BOOL FindFile(LPCTSTR pstrName = null,DWORD dwUnused = 0);
该函数若返回非0 则表明执行成功,0 则表明执行不成功。
pstrName:需要查找的文件名,例:“E:\编程工具\VC++\MFC例子.rar”,“E:\编程工具\VC++\MFC*.rar”,“E:\编程工具\VC++\*.*”,也可以是NULL表示“*.*”。
dwUnused:必须为0
 
virtual BOOL FindNextFile();
该函数返回值非0 还有符合条件的文件, 0表示是最后一个文件。
 
virtual BOOL GetCreationTime(FILETIME *pFileTime) const;
virtual BOOL GetCreationTime(CTime& refTime) const;
该函数用来获得查找到的某个文件的创建时间,返回值非0 获得创建时间成功操作,0表示执行获得创建时间失败或者FindNextFile()没有被执行的时候。
FILETIME  *:容纳时间的结构指针
CTime&:容纳时间的对象地址
此处介绍:FILETIME和CTime相互转换的处理方法:
FILETIME转CTime的方法:
A、CTime对象在初始化时可以传递FILETIME结构
      FILETIME ft;
      CTime time(ft);
B、将FILETIME转换为SYSTEMTIME,然后CTime对象在初始化时可以传递SYSTEMTIME结构
      FILETIME ft;
      SYSTEMTIME st;
      BOOL bSuccess = ::FileTimeToSystemTime(&ft , &st);
      CTime time(st);
CTime转FILETIME方法:
CTime time(CTime::GetCurrentTime());
SYSTEMTIME st;
time.GetAsSystemTime(st);
FILETIME ft;
::SystemTimeToFileTime(&st,&ft);
 
virtual BOOL GetLastAccessTime(FILETIME *pFileTime) const;
virtual BOOL GetLastAccessTime(CTime& refTime) const;
该函数用来获得某个文件最后被访问的时间,非0表示执行成功,0表示执行失败或者FindNextFile()函数没有执行的时候。
 
virtual BOOL GetLastWriteTime(FILETIME *pFileTime) const;
virtual BOOL GetLastWriteTime(CTime& refTime) const;
该函数用来获得某个文件最后被访问的时间,非0表示执行成功,0表示执行失败或者FindNextFile()函数没有执行的时候。
 
virtual CString GetFilePath() const;
该函数用来获得查找到的文件绝对路径,必须在执行了FindNextFile()后该函数才能执行成功。
返回的结果是CString对象,例“E:\编程工具\VC++\MFC.rar
 
virtual CString GetFileName() const;
该函数用来获得查找到的文件的全称,必须在执行了FindNextFile()后该函数才能执行成功。
返回的结果是CString对象,例“MFC.rar”
 
virtual CString GetFileTitle() const;
该函数用来获得查找到的文件的名称,必须在执行了FindNextFile()后该函数才能执行成功。
返回的结果是CString对象,例“MFC”
 
virtual CString GetRoot() const;
该函数用来获得查找到的文件的根目录,必须在执行了FindNextFile()后该函数才能执行成功。
返回的结果是CString对象,例“E:\编程工具\VC++\
 
virtual CString GetFileURL() const;
该函数用来获得查找到的文件的URL路径,必须在执行了FindNextFile()后该函数才能执行成功。
返回的结果是CString对象,例“file://E:\编程工具\VC++\MFC.rar
 
DWORD GetLength() const;
该函数返回值获得查找到的文件的长度,必须在执行了FindNextFile()后该函数才能执行成功。
 
BOOL IsArchived() const;
该函数用来判断查找的文件属性是否是档案文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功
 
BOOL  IsCompressed() const;
该函数用来判断查找的文件属性是否是压缩文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功
 
BOOL IsDirectory() const;
该函数用来判断查找的文件属性是否是路径文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功
 
BOOL IsDots() const;
该函数用来判断查找的文件属性是否是“.”,“..”,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功
 
BOOL IsHidden() const;
该函数用来判断查找的文件属性是否隐藏文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功
 
BOOL IsNormal() const;
该函数用来判断查找的文件属性是否正常文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功
 
BOOL IsReadOnly() const;
该函数用来判断查找的文件属性是否只读文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功
 
BOOL IsSystem() const;
该函数用来判断查找的文件属性是否系统文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功
 
BOOL IsTemporary() const;
该函数用来判断查找的文件属性是否临时文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功
 
BOOL MatchesMask(DWORD dwMask) const;
该函数用来判断查找的文件的综合属性,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功
dwMask参数的使用方法:几种文件属性采用或运算(|)
文件属性的结构定义:
      FILE_ATTRIBUTE_ARCHIVE:档案文件
      FILE_ATTRIBUTE_COMPRESSED:压缩文件
      FILE_ATTRIBUTE_DIRECTORY:路径文件
      FILE_ATTRIBUTE_NORMAL:正常文件
      FILE_ATTRIBUTE_READONLY:只读文件
      FILE_ATTRIBUTE_SYSTEM:系统文件
      FILE_ATTRIBUTE_TEMPORARY:临时文件
      FILE_ATTRIBUTE_HIDDEN:隐藏文件


1、遍历一个目录:

CFileFind Finder ;

CString strDir = DataDir ; //DataDir为要操作的文件所在目录

if( strDir.Right(1) != "\\" )

strDir += "\\" ;

strDir += "*.*" ;

bool bWorking = Finder.FindFile( strDir ) ;

while( bWorking ) 

{

bWorking = Finder.FindNextFile() ;

CString DataFile = Finder.GetFilePath() ; //GetFilePath:得到全路径名

if(finder.IsDirectory() && !finder.IsDots())    //如果是目录        {   }

else if( !Finder.IsDirectory() && !Finder.IsDots() )//不为目录

{

CString FileTitle = Finder.GetFileTitle() ;//GetFileTitle:得到不带后缀文件名

CString FileName = Finder.GetFileName(); //GetFileName:得到带后缀的文件名

//........

}

}

Finder.Close() ;

 

2、成员函数的使用

  于不常使用CFileFind类的人,对GetfilePath()和GetFileName()等函数得到的值很容易混淆,我写了一段代码,看执行后的结果便可知道各函数返回的结果(看不懂没关系,后面还有个例子)。

 l_strFilePath = ff.GetFilePath();   l_strFileName = ff.GetFileName();      l_nPoint = l_strFileName.ReverseFind('.');       // 因为文件名中可能出现多个'.'所以用  ReverseFind而不用Find?   l_nLength = l_strFileName.GetLength();      l_strFileExt = l_strFileName.Right(l_nLength - l_nPoint - 1);      l_strFileTitle = ff.GetFileTitle();   l_strFileUrl = ff.GetFileURL();   l_strFileRoot = ff.GetRoot();   l_dwLength = ff.GetLength();

得到的结果:

Filepath: f:/hoho/hzyong2008.doc

FileName: hzyong2008.doc

FileExe: doc

nFileTitle: hzyong2008

FileUrl: file://f:/hoho/hzyong2008.doc

FileRoot: f:/hoho

FileLength: 603648

对照代码与上面的结果便可以知道各个函数的功能了吧!还有些成员函数没介绍比如GetLastWriteTime(CTime&refTime )。

 

3、文件备份

try{

      CopyFile(strFullName, strBackDir + strFileName, FALSE);   // copy file

      DeleteFile(strFullName);// delete source file

}

catch(CFileException, pEx)

{

      AfxMessageBox("UD文件备份失败");

}

END_CATCH        

 

4、常用文件函数:

if(finder.IsDirectory() && !finder.IsDots()) //如果是目录        {}       IsDirectory()判断是否目录       IsDots()) 判断目录是否为“.”或".."

在dos中每个目录下都有缺省的两个目录分别为"."和".."分别表示上一层目录和本层目录.

因此当我们遍历目录树下的文件时要过滤掉这两个缺省目录。

每个文件夹都有下面两个特殊子文件夹:      (1) .    表示本文件夹自己      (2) ..   表示本文件夹的父文件夹      显然,在文件夹遍历的时候,这两个子文件夹需要特殊处理,否则将陷入死循环。

IsDots():就是判断是不是这两个文件夹的一个.

MSDN帮助解释:

CFileFind::IsDotsvirtual BOOL IsDots( ) const;

Return Value

Nonzero if the found file has the name "." or "..", which indicates that the found file is actually a diretory. Otherwise 0. 

 

删除文件或文件夹:

第一种方法: 定义一个文件类对象来操作       CFile TempFile;        TempFile.Remove(指定文件名);

第二种方法: 使用系统函数 DeleteFile( LPCSTR filename )删除文件 。_rmdir(),删除目录 ,DeleteDirectory(sTempDir); 删除目录 ,RemoveDirectory(sTempDir);删除目录       eg: DeleteFile( char *tempFileName); 

 

上面提到的删除目录的方法只能删除空目录(即空文件夹),如果目录下有文件或者子目录,就不能删除了,VC里好像没有直接的函数,只能手动写个函数来删除了,下面提供一个删除非空目录的方法:

 

void GetDirFiles(LPCSTR lszDirPath, CStringArray &ar) {  if (NULL == lszDirPath)   return;     LONGLONG lnSize = 0;     CFileFind finder;  CString szPath = CString(lszDirPath) + "\*.*";    BOOL bWorking = finder.FindFile(szPath);     while (bWorking)  {    bWorking = finder.FindNextFile();   if (finder.IsDirectory())   {      if (finder.IsDots())     continue;         GetDirFiles(finder.GetFilePath(), ar);   }       ar.Add(finder.GetFilePath());  } } for (int i = 0; i < DelFiles.GetSize(); ++i)   {  const CString &szFile = DelFiles[i];  CString szDir((LPCTSTR)szFile, szFile.ReverseFind('\'));    DeleteFile(szFile); RemoveDirectory(szDir);     } RemoveDirectory(DelParentPath);

这里只写了函数的一小部分。准确的说,是没有一个标准API或者MFC函数来删除一个非空文件夹的(除了用shell方法,不过此方法有弊端),删除非空文件夹的函数只能是自己写。

函数实现思想:
主要是先删除该待删除文件夹内部的所有文件夹和文件夹内的文件,然后在删除该文件夹
。比如我要删除A文件夹,那么A文件夹内如果有B、C文件夹,B文件夹内有1、2、D两个文件和一个文件夹,C文件夹内有3、4、5三个文件。采用深度遍历的思想,这样来记:如果D文件夹没有文件,就删除D文件夹。然后删除B文件夹内的1、2文件,再删除B文件夹。如此下去。


删除非空目录 function如下:(以下测试通过)

BOOL DeleteDirectory(char *DirName) {  USES_CONVERSION;      CFileFind tempFind;    char tempFileFind[200];    sprintf(tempFileFind,"%s\\*.*",DirName);   BOOL IsFinded=(BOOL)tempFind.FindFile(A2T(tempFileFind));      while(IsFinded)    {           IsFinded=(BOOL)tempFind.FindNextFile();         if(!tempFind.IsDots())         {              char foundFileName[200];      CString dd=tempFind.GetFileName();         const char* mm =T2A(dd);    

   //_tcscpy(mm,dd);       /*_tcscpy(mm,dd.GetBuffer());*/             strcpy(foundFileName,(const char*)mm);             if(tempFind.IsDirectory())            {                   char tempDir[200];           sprintf(tempDir,"%s\\%s",DirName,foundFileName);     DeleteDirectory(tempDir);          }            else            {                char tempFileName[200];              sprintf(tempFileName,"%s\\%s",DirName,foundFileName);           DeleteFile(A2T(tempFileName));          }       }    }   tempFind.Close();   if(!RemoveDirctory(A2T(DirName)))  {      MessageBox(0,_T("删除目录失败!","警告信息"),MK_OK);      return FALSE;   }    return TRUE; } //————————测试——————//  char *DirName="C:\\aa";    DeleteDirectory(DirName);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值