讀取目錄下所有的文件名

環境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;
}

發佈了30 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章