C++ 獲得指定目錄下的所有檔名稱
阿新 • • 發佈:2019-01-26
最近工作用到,記錄一下。
參考出處:http://qiaoxinwang.blog.163.com/blog/static/86096452010612139172/
先上一下程式碼:
void getFiles( string path, vector<string>& files ) { //檔案控制代碼 long hFile = 0; //檔案資訊 struct _finddata_t fileinfo; string p; if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) != -1) { do { //如果是目錄,迭代之 //如果不是,加入列表 if((fileinfo.attrib & _A_SUBDIR)) { if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0) getFiles( p.assign(path).append("\\").append(fileinfo.name), files ); } else { files.push_back(p.assign(path).append("\\").append(fileinfo.name) ); } }while(_findnext(hFile, &fileinfo) == 0); _findclose(hFile); } }
程式碼出處
實現以上功能呢,利用了_finddata_t這個struct,_finddata_t包含在標頭檔案<io.h>中。
struct _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 attrib: 檔案屬性儲存位置。它儲存一個unsigned單元,用於表示檔案的屬性。
long _findfirst( char *filespec, struct _finddata_t *fileinfo ); 返回值:如果查詢成功的話,將返回一個long型的唯一的查詢用的控制代碼(就是一個唯一編號)。這個控制代碼將在_findnext函式中被使用。若失敗,則返回-1。 引數: filespec:標明檔案的字串,可支援萬用字元。比如:*.c,則表示當前資料夾下的所有後綴為C的檔案。 fileinfo :這裡就是用來存放檔案資訊的結構體的指標。這個結構體必須在呼叫此函式前宣告,不過不用初始化,只要分配了記憶體空間就可以了。函式成功後,函式會把找到的檔案的資訊放入這個結構體中。 int _findnext( long handle, struct _finddata_t *fileinfo ); 返回值:若成功返回0,否則返回-1。 引數: handle:即由_findfirst函式返回回來的控制代碼。 fileinfo:檔案資訊結構體的指標。找到檔案後,函式將該檔案資訊放入此結構體中。 int _findclose( long handle ); 返回值:成功返回0,失敗返回-1。 引數: handle :_findfirst函式返回回來的控制代碼。
整個流程:查詢第一個檔案,成功後,繼續下一個。。。最後關閉。 上述程式中,用了遞迴,如果是子目錄,遞迴繼續獲取子目錄下的檔案資訊。