純C/C++ 掃描目錄下所有檔案[CB_FileList]

純C/C++ 掃描目錄下所有檔案[CB_FileList]

純C/C++ 掃描目錄下所有檔案[CB_FileList]


GITHUB: https://github.com/jash-git/CB_FileList.git


CODE

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <dirent.h>

//http://jax-work-archive.blogspot.tw/2009/04/c_7783.html

/* dir_recursive [遞迴掃瞄目錄下所有文件]
 * 掃瞄 path 下所有的文件,並輸出至 output 的文件中
 * output 必須為可寫入的文件
 * */
int dir_recursive(char *path, FILE *output){
    char glue='\\'; // Windows 的分隔符號
    //char glue='/'; // Linux 的分隔符號

    // 嘗試開啟目錄
    DIR * dp = opendir(path);

    if (!dp){
        // 不是目錄,輸出至檔案
           fprintf(output,"%s\n",path);
           return 1;
    }

    struct dirent *filename;
    while((filename=readdir(dp))){
        // 跳過當前及母目錄
        if(!strcmp(filename->d_name,"..") || !strcmp(filename->d_name,".")){
            continue;
        }

        // 計算新的路徑字串所需的長度
        int pathLength=strlen(path)+strlen(filename->d_name)+2;
        // 產生新的陣列空間
        char *pathStr = (char*)malloc(sizeof(char) * pathLength);
        // 複製當前目錄路徑至新的陣列空間
        strcpy(pathStr, path);

        // 檢查目錄分隔符號
        int i=strlen(pathStr);
        if(pathStr[i-1]!=glue){
            pathStr[i]=glue;
            pathStr[i+1]='\0';
        }

        // 串接次目錄名稱或檔案名稱至新的陣列空間
        strcat(pathStr, filename->d_name);

        // 遞迴呼叫目錄掃瞄
        dir_recursive(pathStr,output);

    }

    // 關閉目錄
    closedir(dp);

    return 1;
}



int main(){
    // 建立輸出的文件檔
    FILE *fileOut = fopen("output.txt", "w");

    // 掃瞄 E:\test 下所有的文件
    dir_recursive("D:\\sqliteadmin",fileOut);

    return 0;
}

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *