#include #include #include #pragma warning(disable:4996)
int nexenum = 0; // exe的數量
// 函式功能:計算文字的大小
// 函式引數:檔案指標
// 函式返回:文字大小
int getfilesize(file *fp)
// 函式功能:區分檔案exe與dll
// 函式引數:檔案頭指標,指標大小
// 函式返回:1或0
int i***e(byte *pbuf, int nbuflen)
// 函式功能:計算有多少了exe檔案
// 函式返回:exe檔案個數
int filecal(char *strfilename)
// 函式功能:遍歷全部檔案
// 函式返回:無返回值
void listfoldler(char *file)
// 這裡就是檔案
else
} // 關閉以前建立的乙個搜尋控制代碼
_findclose(handle);
} }int main(int argc, char **argv)
finddata_t
的使用那麼到底如何查詢檔案呢?我們需要乙個結構體和幾個大家可能不太熟悉的函式。這些函式和結構體在
的標頭檔案中,結構體為
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
,大概的定義如下:
struct _finddata_t ;
前面也說了,這個結構體是用來儲存檔案資訊的,那麼如何把乙個硬碟檔案的檔案資訊「存到
」這個結構體所表示的記憶體空間裡去呢?這就要靠
_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可執行檔案的程式。
#include
#include
const char *to_search="c:\\windows\\*.exe";
//欲查詢的檔案,支援萬用字元
int main()
_findclose(handle);
//別忘了關閉控制代碼
system("pause");
return 0; }
當然,這個檔案的查詢是在指定的路徑中進行,如何遍歷硬碟,在整個硬碟中查詢檔案呢?大家可以在網路上搜尋檔案遞迴遍歷等方法,這裡不再做進一步介紹。
細心的朋友可能會注意到我在程式的末尾用了乙個
system
函式。這個與程式本身並沒有影響,和以前介紹給大家的使用
getchar()
函式的作用相同,只是為了暫停一下,讓我們能看到命令提示符上輸出的結果而已。不過
system
函式本身是乙個非常強大的函式。大家可以查查
msdn
看看~簡單來說,它是乙個
c語言與作業系統的相互平台,可以在程式裡通過這個函式,向作業系統傳遞
command
命令。
遍歷資料夾
function search path string filename string ball boolean false string varsearchrec tsearchrec begin if findfirst path faanyfile,searchrec 0 then begin...
資料夾遍歷
c 遍歷指定資料夾中的所有檔案 directoryinfo thefolder new directoryinfo folderfullname 遍歷一層資料夾 foreach directoryinfo nextfolder in thefolder.getdirectories 遍歷多層資料夾 ...
遍歷資料夾
使用files類的newdirectorystream方法完成這一功能 path path paths.get d test try catch ioexception e files提供了乙個walkfiletree方法,可以用於遍歷整個資料夾,並且針對每個檔案可以進行特定的處理工作。public...