環境win7x86+vs2010
一:使用多字節字符集情況
#include <string>
#include <vector>
#include <fstream>
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
char *path = "D:\\vs2010\\*.*";
HANDLE file;
WIN32_FIND_DATA fileData;
vector<string> fileNameVector;
file = FindFirstFile(path, &fileData);
while(FindNextFile(file, &fileData))
{
fileNameVector.push_back(fileData.cFileName);
}
for(vector<string>::iterator it = fileNameVector.begin(); it != fileNameVector.end(); ++it)
{
cout << *it << endl;
}
return 0;
}
二:使用unicode字符集情況
#include <string>
#include <vector>
#include <fstream>
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
char *path = "D:\\vs2010\\*.*";
wchar_t pathTemp[1000];
mbstowcs(pathTemp,(const char*)path,999);
HANDLE file;
WIN32_FIND_DATA fileData;
char fileName[1000];
vector<string> fileNameVector;
file = FindFirstFile(pathTemp, &fileData);
while(FindNextFile(file, &fileData))
{
wcstombs(fileName,(const wchar_t*)fileData.cFileName,1000);
fileNameVector.push_back(fileName);
}
for(vector<string>::iterator it = fileNameVector.begin(); it != fileNameVector.end(); ++it)
{
cout << *it << endl;
}
return 0;
}
總結:定義了unicode的時候FindFirstFile()和FindNextFile()接受的是const wchar_t *類型的參數,所以需要把char *類型的目錄通過mbstowcs()函數轉換爲wchar_t *類型。在使用多字節字符集時,FindFirstFile()和FindNextFile()接受的是const char *類型的參數,所以不用轉換。一個更加通用的編程方式是:
#include <string>
#include <vector>
#include <fstream>
#include <windows.h>
#include <iostream>
#include <tchar.h>
using namespace std;
int main()
{
TCHAR *path = _T("D:\\vs2010\\*.*");
HANDLE file;
WIN32_FIND_DATA fileData;
char fileName[1000];
vector<string> fileNameVector;
file = FindFirstFile(path, &fileData);
while(FindNextFile(file, &fileData))
{
#ifdef _UNICODE
wcstombs(fileName,(const wchar_t*)fileData.cFileName,1000);
#else
strcpy(fileName, fileData.cFileName);
#endif
fileNameVector.push_back(fileName);
}
for(vector<string>::iterator it = fileNameVector.begin(); it != fileNameVector.end(); ++it)
{
cout << *it << endl;
}
return 0;
}