? ? ? ?這是一個介紹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類型的路徑賦值給strPathpathStr += "/*.*";//合在一起構成"c:/*.*"CFileFind myFind; //聲明文件搜索類對象findBOOL 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文件是否是檔案