C - 目录探索

时间:2014-09-13 13:33:58

标签: c arrays directory

我想动态填充指定目录路径中包含文件名和目录名的字符串数组。

据您所知,这是否是此目的最快的实施?

如果没有,你能建议另一种实施方式吗?

int exploreDirectory(const char *dirpath, char ***list, int *numItems) {
    DIR *dirstream = NULL;
    struct dirent *direntp = NULL;  
    size_t listSize = 5;

    errno = 0;
    if (!(dirstream = opendir(dirpath))) 
        return errno;       

    if (!((*list) = malloc(sizeof(char *) * listSize))) {
        fprintf(stderr, "Error in list allocation for file list: dirpath=%s.\n", dirpath);
        exit(EXIT_FAILURE);
    }

    *numItems = 0;

    while(1) {
        errno = 0;
        if (!(direntp = readdir(dirstream)))
            break;
        if (*numItems + 1 == listSize) {
            listSize *= 2;          
            if (!((*list) = realloc((*list), sizeof(char *) * listSize))) {
                fprintf(stderr, "Error in list reallocation for file list: dirpath=%s.\n", dirpath);
                exit(EXIT_FAILURE);
            }
        }
        *numItems += 1;     
        (*list)[*numItems - 1] = stringDuplication(direntp->d_name);    
    }

    if (errno != 0) {
        fprintf(stderr, "Error in readdir for file list: dirpath=%s.\n", dirpath);
        exit(EXIT_FAILURE);
    }

    if (closedir(dirstream) == -1) {
        fprintf(stderr, "Error in closedir for file list: dirpath=%s.\n", dirpath);
        exit(EXIT_FAILURE);
    }

    free(direntp);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

这是基于scandir的实现!

int exploreDirectory(const char *dirpath, char ***list, int *numItems) {
    struct dirent **direntList;
    int i;
    errno = 0;

    if ((*numItems = scandir(dirpath, &direntList, NULL, alphasort)) == -1)
        return errno;

    if (!((*list) = malloc(sizeof(char *) * (*numItems)))) {
        fprintf(stderr, "Error in list allocation for file list: dirpath=%s.\n", dirpath);
        exit(EXIT_FAILURE);
    }

    for (i = 0; i < *numItems; i++) {
        (*list)[i] = stringDuplication(direntList[i]->d_name);
    }

    for (i = 0; i < *numItems; i++) {
        free(direntList[i]);
    }

    free(direntList);

    return 0;
}