最新修改的代碼,見http://www.cnblogs.com/farewell-farewell/p/7197644.html
頭文件:#include <windows.h>
//FindFirstFile() 獲得指定目錄的第一個文件 HANDLE FindFirstFile( LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData ); /* lpFileName 是搜索目錄的名稱,注意: \ 需要用轉義字符表達。(”E:\\Folder\\“) lpFindFileData 指向一個用於保存文件信息的結構體。 返回值 調用成功返回HANDLE類型,可用來做為FindNextFile或 FindClose參數; 調用失敗 返回為INVALID_HANDLE_VALUE(即-1) ,可調用GetLastError來獲取錯誤信息。
*/
//FindNextFile()判斷當前目錄下是否有下一個目錄或文件 bool FindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData ); /* HANDLE hFindFile 搜索的文件句柄 函數執行的時候搜索的是此句柄的下一文件 LPWIN32_FIND_DATA lpFindFileData 指向一個用於保存文件信息的結構體 返回值 非零表示成功,零表示失敗。如不再有與指定條件相符的文件,會將GetLastError設置成ERROR_NO_MORE_FILES */
PS: lpFindFileData用於獲取文件信息。通常,最初的兩次搜索得到的文件名為:"." 、"..",分別代表當前目錄和上級目錄。遍歷文件時要注意這兩個目錄。
上述函數的屬性解析:
1. HANDLE(句柄)
是Windows操作系統中的一個概念。在Windows程序中,有各種各樣的資源(窗口、圖標、光標等),系統在創建這些資源時會為它們分配內存,並返回標示這些資源的標示號,即句柄。句柄指的是一個核心對象在某一個進程中的唯一索引,而不是指針。由於地址空間的限制,句柄所標識的內容對進程是不可見的,只能由操作系統通過進程句柄列表來進行維護。句柄列表:每個進程都要創建一個句柄列表,這些句柄指向各種系統資源,比如信號量,線程和文件等,進程中的所有線程都可以訪問這些資源。
無效的返回值為: INVALID_HANDLE_VALUE
PS:HANDLE是一個通用句柄表示,HWND是一個專用表示窗口的句柄。
2.LPCTSTR
用來表示字符是否使用UNICODE, 如果你的程序定義了UNICODE或者其他相關的宏,那么這個字符或者字符串將被作為UNICODE字符串,否則就是標准的ANSI字符串。
LPCTSTR表示一個指向const對象的指針。
3.LPWIN32_FIND_DATA
WIN32_FIND_DATA的指針。LP表示long pointer的意思。
long pointer的含義(摘):
Some processors have two types of pointers, a near pointer and a far pointer. The near pointer is narrower (thus has a limited range) than a far pointer. A far pointer may also be a long pointer. Some processors offer relative addressing for things nearby. A long pointer may indicate that the item is not close by and relative addressing cannot be used. In any case, long pointers are a platform specific issue and may not be portable to other OSes or platforms.
以下為WIN32_FIND_DATA結構體:
typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; // 文件屬性 FILETIME ftCreationTime; // 文件創建時間 FILETIME ftLastAccessTime; // 文件最后一次訪問時間 FILETIME ftLastWriteTime; // 文件最后一次修改時間 DWORD nFileSizeHigh; // 文件長度高 32 位 DWORD nFileSizeLow; // 文件長度低 32 位 DWORD dwReserved0; // 系統保留 DWORD dwReserved1; // 系統保留 TCHAR cFileName[ MAX_PATH ]; // 長文件名 TCHAR cAlternateFileName[ 14 ]; // 文件的可選名 } WIN32_FIND_DATA;
程序示例:
讀取三個文件夾下的文件
#include <opencv2/opencv.hpp> #include <iostream> #include <stdlib.h> #include <windows.h> using namespace std; string getstring(const int n) { stringstream str; str << n; return str.str(); } wchar_t* CharToWchar(const char* c) { wchar_t *m_wchar; int len = MultiByteToWideChar(CP_ACP, 0, c, strlen(c), NULL, 0); m_wchar = new wchar_t[len + 1]; //映射一個字符串到一個寬字符(unicode)的字符串 MultiByteToWideChar(CP_ACP, 0, c, strlen(c), m_wchar, len); m_wchar[len] = '\0'; return m_wchar; } char* WcharToChar(const wchar_t* wp) { char *m_char; //映射一個unicode字符串到一個多字節字符串 int len = WideCharToMultiByte(CP_ACP, 0, wp, wcslen(wp), NULL, 0, NULL, NULL); m_char = new char[len + 1]; WideCharToMultiByte(CP_ACP, 0, wp, wcslen(wp), m_char, len, NULL, NULL); m_char[len] = '\0'; //printf("my char %s\n", m_char); return m_char; } wchar_t* StringToWchar(const string& s) { const char* p = s.c_str(); return CharToWchar(p); } int main() { string Name, Path; for (int i = 0; i < 3; i++){ int j = 0; Path = getstring(i + 1) + "/" + "*.*"; HANDLE hFile; LPCTSTR lp = StringToWchar(Path); WIN32_FIND_DATA pNextInfo; hFile = FindFirstFile(lp, &pNextInfo); if (hFile == INVALID_HANDLE_VALUE){ cout << "failed" << endl; exit(-1);//搜索失敗 } cout << "folder name:" << i + 1 << endl; do{ //必須加這句,不然會加載.和..的文件而加載不了圖片, if (pNextInfo.cFileName[0] == '.')continue; cout << "file name" << WcharToChar(pNextInfo.cFileName) << endl; j++; } while (FindNextFile(hFile, &pNextInfo)); system("pause"); return 0; }
WideCharToMultiByte與MultiByteToWideChar函數
int WideCharToMultiByte( UINT CodePage, //指定執行轉換的代碼頁 DWORD dwFlags, //允許你進行額外的控制,它會影響使用了讀音符號(比如重音)的字符 LPCWSTR lpWideCharStr, //指定要轉換為寬字節字符串的緩沖區 int cchWideChar, //指定由參數lpWideCharStr指向的緩沖區的字符個數 LPSTR lpMultiByteStr, //指向接收被轉換字符串的緩沖區 int cchMultiByte, //指定由參數lpMultiByteStr指向的緩沖區最大值 LPCSTR lpDefaultChar, //遇到一個不能轉換的寬字符,函數便會使用pDefaultChar參數指向的字符 LPBOOL pfUsedDefaultChar //至少有一個字符不能轉換為其多字節形式,函數就會把這個變量設為TRUE ); /* CodePage:指定執行轉換的代碼頁,這個參數可以為系統已安裝或有效的任何代碼頁所給定的值。你也可以指定其為下面的任意一值: CP_ACP:ANSI代碼頁;CP_MACCP:Macintosh代碼頁;CP_OEMCP:OEM代碼頁; CP_SYMBOL:符號代碼頁(42);CP_THREAD_ACP:當前線程ANSI代碼頁; CP_UTF7:使用UTF-7轉換;CP_UTF8:使用UTF-8轉換。 */
int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cchMultiByte, LPWSTR lpWideCharStr, int cchWideChar);
wchar_t是Unicode字符的數據類型
typedef unsigned short wchar_t;
另外,在頭文件中有這樣的定義:
typedef wchar_t WCHAR;
所以WCHAR實際就是wchar_t
