MFC遍历文件夹 删除文件夹 - 小众知识

MFC遍历文件夹 删除文件夹

2013年01月27日 14:18:05 苏内容
  标签: 文件夹
阅读:7328

void CMFCProjectView::OnTestTest()
{
    std::vector<CString> v;
    TraverseDir(CString("F:\\HGUI\\HGUI"), v);
 
#ifdef _UNICODE
    wofstream ofs;
#else
    ofstream ofs;
#endif
    ofs.open("log.txt");
    if (ofs.is_open())
    {
        for (int i=0; i<v.size(); ++i)
        {
            TCHAR* p = v[i].GetBuffer();
            ofs <<p<<endl;
 
        }
        ofs.close();
    }
}
 
 
 
void CMFCProjectView::TraverseDir(CString& dir, std::vector<CString>& vec)
{
    CFileFind ff;
    if (dir.Right(1) != "\\")
        dir += "\\";
    dir += "*.*";
    
    BOOL ret = ff.FindFile(dir);
    while (ret)
    {
        ret = ff.FindNextFile();
        if (ret != 0)
        {
            if (ff.IsDirectory() && !ff.IsDots())
            {
                CString path = ff.GetFilePath();
                TraverseDir(path, vec);
            }
            else if (!ff.IsDirectory() && !ff.IsDots())
            {
                CString name = ff.GetFileName();
                CString path = ff.GetFilePath();
                vec.push_back(path);
            }
        }
    }
}
  

CFileFind类的使用总结
 
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:隐藏文件


//从他的名称可以看出来,其实这是删除一个文件夹,所以会把文件夹下面的所有文件都删除掉 
//这里采用递归调用的方法 
BOOL CFile4Dlg::DeleteDirectory(char *sDirName) 

 
    CFileFind tempFind;   
    char sTempFileFind[200] ;   
    sprintf(sTempFileFind,"%s\\*.*",sDirName); //将第二个参数写入到第一个参数当中 
    BOOL IsFinded = tempFind.FindFile(sTempFileFind);   
    while (IsFinded)   
    {   
        IsFinded = tempFind.FindNextFile();   
        //当这个目录中不含有.的时候,就是说这不是一个文件。 
        if (!tempFind.IsDots())   
        {   
            char sFoundFileName[200];    
            strcpy(sFoundFileName,tempFind.GetFileName().GetBuffer(200));   
            //我感觉这里好像有问题。 
            //如果是目录那么删除目录 
            if (tempFind.IsDirectory())   
            {    
                char sTempDir[200];      
                sprintf(sTempDir,"%s\\%s",sDirName,sFoundFileName);   
                DeleteDirectory(sTempDir); //其实真正删除文件的也就这两句,别的都是陪衬 
            }   
            //如果是文件那么删除文件 
            else     
            {    
                char sTempFileName[200];     
                sprintf(sTempFileName,"%s\\%s",sDirName,sFoundFileName);   
                DeleteFile(sTempFileName);   
            }   
        }   
    }   
    tempFind.Close();   
    if(!RemoveDirectory(sDirName))   
    {   
        return FALSE;    
    }   
    return TRUE;   

扩展阅读