我想动态填充指定目录路径中包含文件名和目录名的字符串数组。
据您所知,这是否是此目的最快的实施?
如果没有,你能建议另一种实施方式吗?
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;
}
答案 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;
}