C語言讀取指定資料夾下的所有檔案(各種資訊)
阿新 • • 發佈:2019-01-01
前言:
由於在做老師佈置的作業過程中需要用到讀取資料夾下所有檔案的功能,由於之前還沒有用 C 語言試過,後面還是通過各種百度之後才解決掉。在這裡做個記錄,以後查閱方便。
分析:
1、標頭檔案:
要實現我們瀏覽某資料夾下各種檔案資訊的功能,我們首先得引入對應的標頭檔案:
#include <io.h>
該標頭檔案包含用於儲存檔案資訊的結構體和讀取檔案的各種操作。
2、儲存檔案資訊的結構體:
這個儲存檔案資訊的結構體的的程式碼大概如下:
struct _finddata_t{
unsigned int attrib; //記錄檔案屬性(隱藏、資料夾、只讀等)
time_t time_create; //檔案建立時間
time_t time_access; //檔案最後被訪問時間
time_t time_write; //檔案最後被修改時間
_fsile_t size; //檔案大小
char name[_MAX_FNAME]; //檔名
};
PS:
- unsigned int attrib 儲存的是檔案的屬性。整數怎麼儲存檔案屬性?因為這些檔案屬性是用位儲存的,具體來說就是某個屬性有對應的位,如果該位上是1,則這個檔案帶有這個屬性。檔案屬性主要有以下一些:_A_ARCH(存檔)、 _A_HIDDEN(隱藏)、_A_NORMAL(正常)、_A_RDONLY(只讀)、_A_SUBDIR(資料夾)、_A_SYSTEM(系統)。這些都是已定義的巨集,可以直接使用。既然是位表示,那麼當一個檔案有多個屬性時,它往往是通過位或的方式,來得到幾個屬性的綜合。例如只讀+隱藏+系統屬性,應該為:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。
- 其中的型別 time_t、_fsize_t 都是系統已存在的定義,例如 typedef long time_t。
3、讀取檔案資訊函式:
讀取檔案列表中的第一個檔案:
long _findfirst(char * filespec , struct _finddata_t * fileinfo);
返回值:
如果查詢成功的話,將返回一個long型的唯一的查詢用的控制代碼(就是一個唯一編號)。這個控制代碼將在_findnext函式中被使用。若失敗,則返回-1。
引數:
filespec:標明檔案的字串,可支援萬用字元。比如:.c,則表示當前資料夾下的所有後綴為 C 的檔案。./test/
.txt,表示當前資料夾下的 test 資料夾下的所有後綴為 txt 檔案。
fileinfo :這裡就是用來存放檔案資訊的結構體的指標。這個結構體必須在呼叫此函式前宣告,不過不用初始化,只要分配了記憶體空間就可以了。函式成功後,函式會把找到的檔案的資訊放入這個結構體中。
讀取檔案列表中的下一個檔案:
int _findnext( long handle, struct _finddata_t *fileinfo );
返回值:
若成功返回0,否則返回-1。
引數:
handle:即由_findfirst函式返回回來的控制代碼。
fileinfo:檔案資訊結構體的指標。找到檔案後,函式將該檔案資訊放入此結構體中。
關閉檔案連結:
int _findclose( long handle );
返回值:
成功返回0,失敗返回-1。
引數:
handle :_findfirst函式返回回來的控制代碼。
試一試:
分析也弄完了,不來個例子簡直對不起觀眾:
#include <stdio.h>
#include<io.h>
int main(void)
{
//檔案儲存資訊結構體
struct _finddata_t fileinfo;
//儲存檔案控制代碼
long fHandle;
//檔案數記錄器
int i = 0;
if( (fHandle=_findfirst( "./test/*.txt", &fileinfo )) == -1L )
{
printf( "當前目錄下沒有txt檔案\n");
return 0;
}
else{
do{
i ++;
printf( "找到檔案:%s,檔案大小:%d\n", fileinfo.name,fileinfo.size);
}while( _findnext(fHandle,&fileinfo)==0);
}
//關閉檔案
_findclose( fHandle );
printf("檔案數量:%d\n",i);
return 0;
}
本部落格設計到的知識面不廣,這裡僅作記錄,大神勿噴。