查找檔案需要一個結構體和幾個函數。結構體為struct _finddata_t,函數為_findfirst、findnext和_findclose。
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單元,用于表示檔案的屬性。檔案屬性是用位表示的,主要有以下一些:
_A_ARCH(存檔)
_A_HIDDEN(隐藏)
_A_NORMAL(正常)
_A_RDONLY(隻讀)
_A_SUBDIR(檔案夾)
_A_SYSTEM(系統)
這些都是在頭檔案中定義的宏,可以直接使用,而本身的意義其實是一個無符号整型(隻不過這個整型應該是2的幾次幂,進而保證隻有1位為1,而其它位為0)。既然是位表示,那麼當一個檔案有多個屬性時,它往往是通過位或的方式,來得到幾個屬性的綜合。例如隻讀+隐藏+系統屬性,應該為:
_A_HIDDEN | _A_RDONLY | _A_SYSTEM
time_t time_create:
這裡的time_t是一個變量類型(長整型?相當于long int?),用來存儲時間的,我們暫時不用理會,隻要知道,這個time_create變量是用來存儲檔案建立時間的就可以了。
time_t time_access:
檔案最後一個被通路的時間。
time_t time_write:
檔案最後一次被修改的時間。
_fsize_t size:
檔案的大小。這裡的_fsize_t應該相當于unsigned整型,表示檔案的位元組數。
char name[_MAX_FNAME]:檔案的檔案名。這裡的_MAX_FNAME是一個常量宏,它在頭檔案中被定義,表示的是檔案名的最大長度。
前面也說了,這個結構體是用來存儲檔案資訊的,那麼如何把一個硬碟檔案的檔案資訊“存到”這個結構體所表示的記憶體空間去呢?這就要靠_findfirst、_findnext和_fineclose三個函數的搭配使用了。
下面一一介紹。
long findfirst(char filespec,struct _finddata_t fileinfo);**
傳回值:如果查找成功的話,将傳回一個long型的唯一的查找用的句柄(就是一個唯一編号)。這個句柄将在_findnext函數中被使用。若失敗,則傳回-1。
參數:
filespec:标明檔案的字元串,可支援通配符。比如:.c,則表示目前檔案夾下的所有字尾為C的檔案。比如:D:\test\,則表示D盤的test檔案夾内的所有檔案。
fileinfo:這裡就是用來存放檔案資訊的結構體的指針。這個結構體必須在調用此函數前聲明,不過不用初始化,隻要配置設定了記憶體空間就可以。函數成功後,函數會把找到的檔案的資訊放入這個結構體中。
int _findnext( long handle, struct _finddata_t *fileinfo );
傳回值:若成功傳回0,否則傳回-1。
參數:
handle:即由_findfirst函數傳回回來的句柄。
fileinfo:檔案資訊結構體的指針。找到檔案後,函數将該檔案資訊放入此結構體中。
int _findclose( long handle );
傳回值:成功傳回0,失敗傳回-1。
參數:
handle:_findfirst函數傳回回來的句柄。
/*
@author:CodingMengmeng
@theme:擷取指定檔案夾下的所有檔案名
@time:2017-1-13 11:46:22
@blog:
*/
#include <io.h>
#include <iostream>
#include <vector>
using namespace std;
void getFiles(string path, vector<string>& files)
{
//檔案句柄
intptr_t 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函數結束查找
_findclose(hFile);
}
}
int main(){
char * filePath = "sam";//自己設定目錄
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;
}
}