利用C++實現(xiàn)獲取文件夾下所有文件名
查找文件需要一個結(jié)構(gòu)體和幾個函數(shù)。結(jié)構(gòu)體為struct _finddata_t,函數(shù)為_findfirst、findnext和_findclose。
struct _finddata_t
這個結(jié)構(gòu)體是用來存儲文件各種信息的。定義如下:
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單元,用于表示文件的屬性。文件屬性是用位表示的,主要有以下一些:
- _A_ARCH(存檔)
- _A_HIDDEN(隱藏)
- _A_NORMAL(正常)
- _A_RDONLY(只讀)
- _A_SUBDIR(文件夾)
- _A_SYSTEM(系統(tǒng))
這些都是在頭文件中定義的宏,可以直接使用,而本身的意義其實是一個無符號整型(只不過這個整型應(yīng)該是2的幾次冪,從而保證只有1位為1,而其它位為0)。既然是位表示,那么當(dāng)一個文件有多個屬性時,它往往是通過位或的方式,來得到幾個屬性的綜合。例如只讀+隱藏+系統(tǒng)屬性,應(yīng)該為:
_A_HIDDEN | _A_RDONLY | _A_SYSTEM
time_t time_create:
這里的time_t是一個變量類型(長整型?相當(dāng)于long int?),用來存儲時間的,我們暫時不用理會,只要知道,這個time_create變量是用來存儲文件創(chuàng)建時間的就可以了。
time_t time_access:
文件最后一個被訪問的時間。
time_t time_write:
文件最后一次被修改的時間。
_fsize_t size:
文件的大小。這里的_fsize_t應(yīng)該相當(dāng)于unsigned整型,表示文件的字節(jié)數(shù)。
char name[_MAX_FNAME]:文件的文件名。這里的_MAX_FNAME是一個常量宏,它在頭文件中被定義,表示的是文件名的最大長度。
前面也說了,這個結(jié)構(gòu)體是用來存儲文件信息的,那么如何把一個硬盤文件的文件信息“存到”這個結(jié)構(gòu)體所表示的內(nèi)存空間去呢?這就要靠_findfirst、_findnext和_fineclose三個函數(shù)的搭配使用了。
下面一一介紹。
long findfirst(char* filespec,struct _finddata_t* fileinfo);
返回值:如果查找成功的話,將返回一個long型的唯一的查找用的句柄(就是一個唯一編號)。這個句柄將在_findnext函數(shù)中被使用。若失敗,則返回-1。
參數(shù):
filespec:標(biāo)明文件的字符串,可支持通配符。比如:*.c,則表示當(dāng)前文件夾下的所有后綴為C的文件。比如:D:\\test\\*,則表示D盤的test文件夾內(nèi)的所有文件。
fileinfo:這里就是用來存放文件信息的結(jié)構(gòu)體的指針。這個結(jié)構(gòu)體必須在調(diào)用此函數(shù)前聲明,不過不用初始化,只要分配了內(nèi)存空間就可以。函數(shù)成功后,函數(shù)會把找到的文件的信息放入這個結(jié)構(gòu)體中。
int _findnext( long handle, struct _finddata_t *fileinfo );
返回值:若成功返回0,否則返回-1。
參數(shù):
handle:即由_findfirst函數(shù)返回回來的句柄。
fileinfo:文件信息結(jié)構(gòu)體的指針。找到文件后,函數(shù)將該文件信息放入此結(jié)構(gòu)體中。
int _findclose( long handle );
返回值:成功返回0,失敗返回-1。
參數(shù):
handle:_findfirst函數(shù)返回回來的句柄。
看到這里,估計都能猜到個大概了吧?先用_findfirst查找第一個文件,若成功則用返回的句柄調(diào)用_findnext函數(shù)查找其它的文件,當(dāng)查找完畢后,用_findclose函數(shù)結(jié)束查找。下面我們就按照這個思路來編寫一個查找工程目錄下的sam文件夾內(nèi)的所有文件,并輸出文件名。
/* @author:CodingMengmeng @theme:獲取指定文件夾下的所有文件名 @time:2017-1-13 11:46:22 @blog:http://www.cnblogs.com/codingmengmeng/ */ #include <io.h> #include <iostream> #include <vector> using namespace std; void getFiles(string path, vector<string>& files) { //文件句柄 long hFile = 0; //文件信息,聲明一個存儲文件信息的結(jié)構(gòu)體 struct _finddata_t fileinfo; string p;//字符串,存放路徑 if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)//若查找成功,則進入 { do { //如果是目錄,迭代之(即文件夾內(nèi)還有文件夾) if ((fileinfo.attrib & _A_SUBDIR)) { //文件名不等于"."&&文件名不等于".." //.表示當(dāng)前目錄 //..表示當(dāng)前目錄的父目錄 //判斷時,兩者都要忽略,不然就無限遞歸跳不出去了! 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函數(shù)結(jié)束查找 _findclose(hFile); } } int main(){ char * filePath = "sam";//自己設(shè)置目錄 vector<string> files; 獲取該路徑下的所有文件 getFiles(filePath, files); char str[30]; int size = files.size(); for (int i = 0; i < size; i++) { cout << files[i].c_str() << endl; } }
運行結(jié)果:
到此這篇關(guān)于利用C++實現(xiàn)獲取文件夾下所有文件名的文章就介紹到這了,更多相關(guān)C++獲取文件名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言循環(huán)隊列與用隊列實現(xiàn)棧問題解析
循環(huán)隊列又叫環(huán)形隊列,是一種特殊的隊列。循環(huán)隊列解決了隊列出隊時需要將所有數(shù)據(jù)前移一位的問題,本篇帶你一起看看循環(huán)隊列的問題和怎樣用隊列實現(xiàn)棧2022-04-04C/C++?Qt?TabWidget?實現(xiàn)多窗體創(chuàng)建詳解
TabWidget組件配合自定義Dialog組件,可實現(xiàn)一個復(fù)雜的多窗體分頁結(jié)構(gòu)。這篇文章就主要介紹了如何通過TabWidget實現(xiàn)多窗體的創(chuàng)建,感興趣的小伙伴可以了解一下2021-12-12Qt連接數(shù)據(jù)庫并實現(xiàn)數(shù)據(jù)庫增刪改查的圖文教程
QT連接數(shù)據(jù)庫是應(yīng)用開發(fā)的常用基礎(chǔ)操作,經(jīng)過實驗我總結(jié)了一些例程,下面這篇文章主要給大家介紹了關(guān)于Qt連接數(shù)據(jù)庫并實現(xiàn)數(shù)據(jù)庫增刪改查的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04