C 獲取資料夾下的所有檔名

2022-05-05 09:30:09 字數 4627 閱讀 6477

獲取資料夾下所有的檔名是常用的功能,今天再一次有這樣的需求,所有就在網上查詢了很多,並記下以供後用。

原文:原文:

標頭檔案:#include

1char * filepath = "

d:\\sample

";

1 vectorfiles;  23

////獲取該路徑下的所有檔案

4getfiles(filepath, files ); 56

char str[30

];

7int size =files.size();

8for (int i = 0;i < size;i++)

9

1

void getfiles( string path, vector&files ) 2

19else

20

23 }while(_findnext(hfile, &fileinfo) == 0

);

24_findclose(hfile);

25}

26 }

那麼到底如何查詢檔案呢?我們需要乙個結構體和幾個大家可能不太熟悉的函式。這些函式和結構體在的標頭檔案中,結構體為struct _finddata_t ,函式為_findfirst、_findnext和_fineclose。具體如何使用,我會慢慢講來~

首先講這個結構體吧~ struct _finddata_t ,這個結構體是用來儲存檔案各種資訊的。說實話,這個結構體的具體定義**,我沒有找到,不過還好,文件裡面在_find裡有比較詳細的成員變數介紹。我基本上就把文件翻譯過來講吧:

unsigned atrrib:檔案屬性的儲存位置。它儲存乙個unsigned單元,用於表示檔案的屬性。檔案屬性是用位表示的,主要有以下一些:_a_arch(存檔)、_a_hidden(隱藏)、_a_normal(正常)、_a_rdonly(唯讀)、_a_subdir(資料夾)、_a_system(系統)。

這些都是在中定義的巨集,可以直接使用,而本身的意義其實是乙個無符號整型(只不過這個整型應該是2的幾次冪,從而保證只有一位為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是乙個常量巨集,它在標頭檔案中被定義,表示的是檔名的最大長度。

以此,我們可以推測出,struct _finddata_t ,大概的定義如下:

1

struct

_finddata_t

2;

前面也說了,這個結構體是用來儲存檔案資訊的,那麼如何把乙個硬碟檔案的檔案資訊「存到」這個結構體所表示的記憶體空間裡去呢?這就要靠_findfirst、_findnext和_fineclose三個函式的搭配使用了。

首先還是對這三個函式一一介紹一番吧……

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函式返回回來的控制代碼。

大家看到這裡,估計都能猜到個大概了吧?先用_findfirst查詢第乙個檔案,若成功則用返回的控制代碼呼叫_findnext函式查詢其他的檔案,當查詢完畢後用,用_findclose函式結束查詢。恩,對,這就是正確思路。下面我們就按照這樣的思路來編寫乙個查詢c:\windows資料夾下的所有exe可執行檔案的程式。

1 #include 2         #include 345

const

char *to_search="

c:\\windows\\*.exe

"; //

欲查詢的檔案,支援萬用字元67

8int

main()

919 _findclose(handle); //

別忘了關閉控制代碼

20 system("

pause");

21return0;

22 }

當然,這個檔案的查詢是在指定的路徑中進行,如何遍歷硬碟,在整個硬碟中查詢檔案呢?大家可以在網路上搜尋檔案遞迴遍歷等方法,這裡不再做進一步介紹。

細心的朋友可能會注意到我在程式的末尾用了乙個system函式。這個與程式本身並沒有影響,和以前介紹給大家的使用getchar()函式的作用相同,只是為了暫停一下,讓我們能看到命令提示符上輸出的結果而已。不過system函式本身是乙個非常強大的函式。大家可以查查msdn看看~ 簡單來說,它是乙個c語言與作業系統的相互平台,可以在程式裡通過這個函式,向作業系統傳遞command命令

主要用到了以下幾個標頭檔案(類):io.h, fstream, string。

首先,讀取某給定路徑下所有資料夾與檔名稱,並帶完整路徑。實現**如下:

void getallfiles( string path, vector& files) 

} else

}while(_findnext(hfile, &fileinfo) == 0);

_findclose(hfile);

} }

該函式有兩個引數,第乙個為路徑字串(string型別,最好為絕對路徑);第二個引數為資料夾與檔名稱儲存變數(vector型別,引用傳遞)。

在主函式中呼叫格式(並將結果儲存在檔案"allfiles.txt"中,第一行為總數):

char * filepath = "e:\\yunshi"; 

vectorfiles;

char * distall = "allfiles.txt";

getfilesall(filepath, files);

ofstream ofn(distall);

int size = files.size();

ofn《同理,只讀取某給定路徑下的當前資料夾名(以下類似,只給出函式,呼叫案例同上):

void getjustcurrentdir( string path, vector& files)

} }while(_findnext(hfile, &fileinfo) == 0);

_findclose(hfile);

} }

只讀取某給定路徑下的當前檔名:

void getjustcurrentfile( string path, vector& files) 

else

}while(_findnext(hfile, &fileinfo) == 0);

_findclose(hfile);

} }

只讀取某給定路徑下的所有檔名(即包含當前目錄及子目錄的檔案):

void getfilesall( string path, vector& files) 

} else

}while(_findnext(hfile, &fileinfo) == 0);

_findclose(hfile);

} }

C 獲取資料夾下所有檔名

查詢檔案需要乙個結構體和幾個函式。結構體為struct finddata t,函式為 findfirst findnext和 findclose。struct finddata t 這個結構體是用來儲存檔案各種資訊的。定義如下 struct finddata t 其中各成員變數的含義如下 unsig...

C 獲取資料夾下所有檔名

1.實現 1 2 author codingmengmeng 3 theme 獲取指定資料夾下的所有檔名 4 time 2017 1 13 11 46 22 5 blog 7 include 8 include 9 include 10 using namespace std 1112 void g...

獲取資料夾下所有檔名

有時我們想要把乙個資料夾中的所有檔名整理到乙個execl檔案中,便於管理和查詢以及列印,多數是使用 複製 貼上 方法 將資料夾中的檔案重新命名,在可編輯狀態下進行複製,而後在其他文件中貼上 這種辦法可行,但對於資料夾中有大量的檔案的情況,則工作效率低,而且做完後必須核對。利用dos的重定向命令 可方...