利用目錄函數(opendir,readdir,closedir)查找文件個數


如何知道一個目錄下的所有文件個數呢?或許可以用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;

}

就這樣,統計文件數目的小程序就完成了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM