linux获取子文件和子目录

keep-minding / 2023-07-29 / 原文

linux获取子文件和子目录

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

#include <string>
#include <vector>

#include <stdio.h>

// #include <android/log.h>

#define TAG "[demo]"
// #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__);
// #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__);
// #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__);

#define LOGD(...) fprintf(stdout, __VA_ARGS__);
#define LOGE(...) fprintf(stderr, __VA_ARGS__);
#define LOGI(...) fprintf(stdout, __VA_ARGS__);


// mode=1: 文件;mode=2: 目录
void getFileList(std::string dir_name, std::vector<std::string>& files, int mode){
    if (dir_name.empty()) {
        LOGE("%s", "dir_name is empty!");
        return;
    }
    struct stat s;
    stat(dir_name.c_str(), &s);
    if(!S_ISDIR(s.st_mode)) {
        LOGE("%s %s %s", "dir_name: ", dir_name.c_str(), " is not a valid directory!");
        return;
    }
    struct dirent *filename;
    DIR *dir;
    dir = opendir(dir_name.c_str());
    if(NULL == dir) {
        LOGE("%s %s %s ", "Can not open dir: ", dir_name.c_str() ,"!");
        return;
    }
    while ((filename = readdir(dir)) != NULL) {
        if(strcmp(filename->d_name, ".") == 0 ||
           strcmp(filename->d_name, "..") == 0)
            continue;
//         std::string filePath = dir_name + "/" + filename->d_name;
        std::string filePath = filename->d_name;
        if (((mode & 1) && is_file((dir_name + "/" + filePath).c_str()))
            || ((mode & 2) && is_dir((dir_name + "/" + filePath).c_str()))
            || (mode == 0)) {
            files.push_back(filePath);
        }
    }
    closedir(dir);
}

bool is_file(const char* filestr) {
    struct stat   buffer;
    return (stat (filestr, &buffer) == 0 && S_ISREG(buffer.st_mode));
}

bool is_dir(const char* filestr) {
    struct stat   buffer;
    return (stat (filestr, &buffer) == 0 && S_ISDIR(buffer.st_mode));
}