c++讀取資料夾中檔案
直接上程式碼:
void getFiles(string path, vector<string>& pic_files) { //檔案控制代碼 intptr_t hFile; //檔案資訊 struct _finddata_t fileinfo; string p; if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) { do { //如果不是,加入列表 if ((fileinfo.attrib & _A_SUBDIR)) { //int strcmp(const char* s1,const char* s2) //當s1<s2時,返回為負數; //當s1==s2時,返回值= 0; //當s1>s2時,返回正數。 if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) //如果是目錄,迭代 getFiles(p.assign(path).append("\\").append(fileinfo.name), pic_files); } else { //加入列表 pic_files.push_back(p.assign(path).append("\\").append(fileinfo.name)); } } while (_findnext(hFile, &fileinfo) == 0); _findclose(hFile); } }
其中主要用到了 _finddata_t 結構:
struct _finddata_t
{
unsigned attrib;
time_t time_create;//建立時間
time_t time_access;//最後訪問時間
time_t time_write;//最後修改時間
_fsize_t size;//大小
char name[_MAX_FNAME];//檔名
};
其中unsigned atrrib表示了檔案屬性的儲存位置。它儲存一個unsigned單元,用於表示檔案的屬性。檔案屬性是用位表示的,主要有以下一些:_A_ARCH(存檔)、_A_HIDDEN(隱藏)、_A_NORMAL(正常)、_A_RDONLY(只讀)、_A_SUBDIR(資料夾)、_A_SYSTEM(系統)。
程式碼中的_findfirst、_findnext和_fineclose介紹:
long _findfirst( char *filespec, struct _finddata_t *fileinfo );
返回值:如果查詢成功的話,將返回一個long型的唯一的查詢用的控制代碼。這個控制代碼將在_findnext函式中被使用。
若失敗,則返回-1。
在vs2015,release x64中,如果使用long會報錯,(ntdll.dll)處(位於 xxxxxxx.exe 中)引發的異常,將其修改為:
intptr_t _findfirst( char *filespec, struct _finddata_t *fileinfo );
filespec:標明檔案的字串,可支援萬用字元。比如:*.c,則表示當前資料夾下的所有後綴為C的檔案。
fileinfo :這裡就是用來存放檔案資訊的結構體的指標。這個結構體必須在呼叫此函式前宣告,不過不用初始化,只要分配了記憶體空間就可以了。函式成功後,函式會把找到的檔案的資訊放入這個結構體中。
int _findnext( long handle, struct _finddata_t *fileinfo );
handle :_findfirst函式返回回來的控制代碼。
fileinfo:檔案資訊結構體的指標。找到檔案後,函式將該檔案資訊放入此結構體中。
int _findclose( long handle );
返回值:成功返回0,失敗返回-1。
handle :_findfirst函式返回回來的控制代碼。