FindFirstFile FindNextFile 以及_WIN32_FIND_DATA结构
文章目錄
- `_WIN32_FIND_DATA`
- 作用:
- FindFirstFile
- 函數功能
- 函數聲明
- 第一個參數
- 第二個參數
- 返回值(搜索句柄)
- FindNextFile
- 函數功能
- 函數聲明
- 第一個參數
- 第二個參數
- 返回值(BOOL)
- 實現代碼:
- 注意點:
首先需要介紹 陌生的東西:
_WIN32_FIND_DATA
作用:
關于文件的全部屬性信息??傆嬘幸韵乱韵?種:文件的標題名、文件的屬性(只讀、存檔,隱藏等)、文件的創(chuàng)建時間、文件的最后訪問時間、文件的最后修改時間、文件大小的高位雙字、文件大小的低位雙字、保留、保留。在這里只有文件標題名和文件的長度可以通過CFile類比較方便的獲得,而對于其他幾種屬性的獲取和設置就無能為力了。
在用findfirst()和findnext()函數去查找磁盤文件時經常使用的一個數據結構WIN32_FIND_DATA的成員變量里包含了以上所有的文件屬性,因此可以通過這個結構作為獲取和更改文件屬性的手段。該結構的內容如下:
typedef struct _WIN32_FIND_DATA {DWORD dwFileAttributes;FILETIME ftCreationTime;FILETIME ftLastAccessTime;FILETIME ftLastWriteTime;DWORD nFileSizeHigh;DWORD nFileSizeLow;DWORD dwReserved0;DWORD dwReserved1;_Field_z_ CHAR cFileName[ MAX_PATH ];_Field_z_ CHAR cAlternateFileName[ 14 ]; #ifdef _MACDWORD dwFileType;DWORD dwCreatorType;WORD wFinderFlags; #endif } WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA; typedef struct _WIN32_FIND_DATA {DWORD dwFileAttributes; //文件屬性FILETIME ftCreationTime; // 文件創(chuàng)建時間FILETIME ftLastAccessTime; // 文件最后一次訪問時間FILETIME ftLastWriteTime; // 文件最后一次修改時間DWORD nFileSizeHigh; // 文件長度高32位DWORD nFileSizeLow; // 文件長度低32位DWORD dwReserved0; // 系統(tǒng)保留DWORD dwReserved1; // 系統(tǒng)保留TCHAR cFileName[ MAX_PATH ]; // 長文件名TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名}注意:在使用這個結構時不能手工修改這個結構中的任何數據,結構對于開發(fā)人員來說只能作為一個只讀數據,其所有的成員變量都會由系統(tǒng)完成填寫。在MSDN幫助中可以查找到關于WIN32_FIND_DATA結構的更加詳細的說明
可以通過FindFirstFile()函數根據當前的文件存放路徑查找該文件來把待操作文件的相關屬性讀取到WIN32_FIND_DATA結構中
FindFirstFile
函數功能
根據文件名查找文件。該函數到一個文件夾(包括子文件夾)去搜索指定文件 如果要使用附加屬性去搜索文件的話 可以使用FindFirstFileEx函數。
函數聲明
HANDLE FindFirstFile(_In_ LPCSTR lpFileName,_Out_ LPWIN32_FIND_DATAA lpFindFileData);第一個參數
輸入參數,lpFileNameString,欲搜索的文件名。參數可如下(注!一定要帶文件名。如果參數為“c:\Windows”,則返回的文件名為“Windows”,并且接下來調用FindNextFile會返回失敗)
第二個參數
輸出參數,_WIN32_FIND_DATA,這個結構用于裝載與找到的文件有關的信息。該結構可用于后續(xù)的搜索
結構說明:
dwFileAttributes字段可以是下面取值的組合,通過這個字段可以檢查找到的究竟是一個文件還是一個子目錄,以及其他的文件屬性
(返回的文件名中會包含".“和”. ."?!?'代表本目錄,". ."代表上一層目錄。一般情況下需要把這兩個名稱過濾掉。比如要進行文件刪除操作)
返回值(搜索句柄)
Long,如執(zhí)行成功,返回一個搜索句柄,可以作為一個參數用于FindNextFile函數。如果出錯,返回一個INVALID_HANDLE_VALUE常數,一旦不再需要,應該用FindClose函數關閉這個句柄
FindNextFile
函數功能
顧名思義,用于搜索下一個文件,當不存在下一個文件,即搜索完畢后,返回false;
函數聲明
BOOL WINAPI FindNextFile(_In_ HANDLE hFindFile,_Out_ LPWIN32_FIND_DATA lpFindFileData );第一個參數
輸入參數,hFindFile 上一次FindFirstFile或FindNextFile得到的HANDLE
第二個參數
輸出參數,lpFindFileData 用于保存搜索得到的文件信息,也就是我們上方說過的_WIN32_FIND_DATA結構體
lpFindFileData用于獲取文件信息。通常,最初的兩次搜索得到的文件名為:"." 、". .",分別代表當前目錄和上級目錄。寫代碼時需要注意。上面已經提示。
返回值(BOOL)
它的返回值可不是HANDLE類型哦,而是BOOL,顧名思義,也就是能找到下一個文件,則返回TRUE,不能則返回FALSE
實現代碼:
#include<Windows.h> #include <iostream> using namespace std;DWORD EnumerateFileInDirectory(LPTSTR szPath) {WIN32_FIND_DATA FindFileData;HANDLE hListFile;TCHAR szFilePath[MAX_PATH];lstrcpy(szFilePath, szPath);lstrcat(szFilePath, (LPCSTR)"\\\\*");hListFile = FindFirstFile(szFilePath, &FindFileData);if (hListFile == INVALID_HANDLE_VALUE) {printf("%s", GetLastError());return 1;}else {do {if (lstrcmp(FindFileData.cFileName, ".") == 0 || lstrcmp(FindFileData.cFileName, "..") == 0) {continue;}printf("%s\t\t", FindFileData.cFileName);if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED){printf("加密文件\t");}if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN){printf("隱藏文件\t");}if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){printf("DIR\t");}printf("\n");} while (FindNextFile(hListFile,&FindFileData));}return 0; } int main() {EnumerateFileInDirectory((LPTSTR)"F:\\\\"); }注意點:
a.我這里面用了 \ \ \ \因為有兩個在字符串里是轉義,然后的話就不得不寫出四個,因為\\代表路徑下一級嘛
b._WIN32_FIND_DATA結構里面的屬性值其實根據是二進制位的設置,要通過按位與從而來查看相應的屬性
總結
以上是生活随笔為你收集整理的FindFirstFile FindNextFile 以及_WIN32_FIND_DATA结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GetModuleFileName
- 下一篇: 2021年1月10日停电感慨