如何知道一個目錄下的所有文件個數呢?或許可以用tree來學(zhuang)習(bi)的同時知道文件個數。Linux系統io函數為我們提供了目錄操作函數,其中有一個比較重要(實際上有三個,因為它們經常配套使用。)。我們可以利用它來遞歸的讀取目錄,從而知道指定目錄下有多少個文件。下面我來介紹一下:
opendir函數:
函數原型:DIR *opendir(const char *name);
依賴頭文件: #include <sys/types.h> #include <dirent.h>
作用:打開一個目錄。
返回值:DIR結構體指針,(DIR類似於FILE結構體)保存了所打開的的目錄信息;失敗返回NULL。
readdir函數:
函數原型:struct dirent *readdir(DIR *dirp);
依賴頭文件:#include <dirent.h>
作用:讀目錄。
返回值:成功返回dirent結構體指針。失敗返回NULL。這里我們來仔細看看dirent結構體的組成:
closedir:
函數原型:int closedir(DIR *dirp);
依賴頭文件:#include <sys/types.h> #include <dirent.h>
返回值:成功返回0,失敗返回-1。
接下來我們開始編碼:
我們先定義一個函數:long get_dir_number(char * filepath)
下面是它的內容:
long get_dir_number(char * filepath)
{
long FileNumber = 0;//存儲文件個數
DIR *dir = opendir(filepath);//先打開文件
if (NULL == dir)//判斷是否打開成功
{
perror("打開文件");
exit(1);
}
struct dirent *di;//dirent結構體指針,用於指向數據
char p_file[1024];//用於拼接字符串。遇到子目錄。
while ((di = readdir(dir)) != NULL)
{
//要忽略掉.和 .. 如果讀到它們,就不要對他們操作。
if (strcmp(di->d_name, ".") == 0 || strcmp(di->d_name, "..") == 0)
//strcmp函數用於比較字符串,相等返回0;
{
continue;//忽略掉
}
//遇到目錄就要進入,使用遞歸
else if (di->d_type == DT_DIR)
{
sprintf(p_file, "%s / %s", filepath, di->d_name);
FileNumber += get_dir_number(p_file);//這里是+=
}
else//我這里是統計的所有文件,不管是什么類型的。可以自定義條件,統計不同類型的文件數目
{
FileNumber++;
}
}
closedir(dir);
return FileNumber;
}
挺簡單的。現在來看主函數:
#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
long get_dir_number(char * filepath);//函數聲明
int main(int argc, char *argv[])
{
if (argc<2)
{
printf("需要目錄名。\n");
exit(1);
}
long nu = get_dir_number(argv[1]);
printf("%s目錄下有%ld個文件。\n", argv[1], nu);
return 0;
}
就這樣,統計文件數目的小程序就完成了。