使用C語言檢視一個資料夾中所有檔案及目錄
1.前言
1.1宣告
文章中的文字可能存在語法錯語以及標點錯誤,請諒解;
如果在文章中發現程式碼錯誤或其它問題請告知,感謝!
2.實現方法
為了使用C語言實現檢視一個資料夾中的檔案數量功能,可以使用dirent庫,該庫檔案包含的許多UNIX系統服務的函式原型,例如opendir函式、readdir函式,可以實現檢視目錄中檔案數量等功能。
2.1dirent中常用資料型別以及函式功能簡介
下面對dirent中常用的資料型別以及函式進行簡單的解釋:
常用結構體:
DIR結構體:
struct __dirstream
{
void *__fd;
char *__data;
int __entry_data;
char *__ptr;
int __entry_ptr;
size_t __allocation;
size_t __size;
__libc_lock_define (, __lock)
};
typedef struct __dirstream DIR;
DIR結構體類似與FILE,可以使用該結構體儲存正在被讀取目錄的有關資訊,例如開啟目錄函式DIR* opendir(const char* FilePath),該函式返回值為指向DIR結構的指標(控制代碼),通過該指標所指向的DIR型別的結構體,可以得到該目錄相關資訊。
dirent的結構體:
struct dirent
{
long d_ino; /* inode number 索引節點號 在<sys/types.h>檔案該型別的描述*/
off_t d_off; /* offset to this dirent 在目錄檔案中的偏移 */
unsigned short d_reclen; /* length of this d_name 檔名長 */
unsigned char d_type; /* the type of d_name 檔案型別 */
char d_name [NAME_MAX+1]; /* file name (null-terminated) 檔名,最長256字元 */
}
一般該結構體配合readdir函式使用,也就是通過readdir函式獲取到的檔案屬性儲存到該結構體中。
需要注意的是,對於dirent的結構體,我們經常能用到該結構體中d_ name 變數, 另外 ,short d_reclen是指這個檔案的檔名長度,而不是檔案大小。當然,如果要獲得該檔案大小,可以使用sizeof ( d _name)實現。
(當然,如果我們想要得到該檔案的更多資訊,可以使用stat函式實現,具體用法可以參見下面的部落格:
https://blog.csdn.net/farmwang/article/details/77996187)
通過上述介紹,可以簡單概括dirent結構體和DIR結構體的區別:dirent結構體儲存的是檔案屬性,DIR結構體儲存的目錄屬性。
常用庫函式:
DIR* opendir(const char);
通過開啟一個目錄路徑(const char)返回一個DIR型別的指標,後續對該目錄的讀取和搜尋操作都使用該指標。
dirent* readdir(DIR*);
返回DIR中的目錄或者檔案實體指標,型別為dirent,需要注意的是,當該函式再一次被呼叫的時候,該dirent指標指向下一個目錄或者檔案實體。當函式返回NULL時,表明指標已經指向目錄的結尾。
void seekdir (DIR * dir, long int offset);
用來設定目錄操作流的讀取位置,呼叫seekdir函式的時候便從該位置進行讀取。引數offset表示相對於檔案目錄開頭的偏移量。
int telldir(DIR *dir) ;
返回當前目錄流中指標位置。改位置是相對於檔案開頭偏移量的下一個實體讀取位置的返回值。
2.2函式實現
2.2.1實現邏輯
實現方法一般為:
1.開啟目錄(opendir());
2.讀取檔案(readdir());
3.關閉目錄( closedir)。
2.2.2函式例子
#include <stdio.h>
#include "dirent.h"
#define FilePath "/opt/test"
int main()
{
int filesize = 0;
DIR *dir = NULL;
struct dirent *entry;
if((dir = opendir(FilePath))==NULL)
{
printf("opendir failed!");
return -1;
}
else
{
while(entry=readdir(dir))
{
printf("filename%d = %s",i,entry->d_name); //輸出檔案或者目錄的名稱
printf("filetype = %d\n",entry->d_type); //輸出檔案型別
}
closedir(dir);
}
return 0;
}
執行結果如下: