这是一段看似非常特殊的C代码。出于某些奇怪的原因,DT_DIR应该忽略文件夹,但它不会:
char** getFiles(char* pathToScan, int size)
{
DIR *d;
struct dirent *dir;
char** filesName;
int i=0;
filesName = malloc(sizeof(char*)*size);
d = opendir(pathToScan);
if (d)
{
while ((dir = readdir(d)) != NULL)
{
if (dir->d_type != DT_DIR)
{
*(filesName + i-2) = malloc(sizeof(char)*strlen(pathToScan) + sizeof(char)*strlen(dir->d_name));
strcpy(*(filesName + i-2), pathToScan);
strcat(*(filesName + i-2), "\\");
strcat(*(filesName + i-2), dir->d_name);
}
i++;
}
closedir(d);
}
return filesName;
}
我的第一个想法是DT_DIR存在问题 (read about DT_DIR),但我不知道该怎么做。
发生了什么事?为什么DT_DIR不会忽略文件夹?
答案 0 :(得分:1)
我将size理解为要返回的文件数量的限制。
asprintf
似乎更简单
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
static char** getFiles(char* pathToScan, int *size)
{
DIR *d;
struct dirent *dir;
char** filesName;
char *f;
int i = 0;
filesName = malloc(sizeof(char*) * *size);
d = opendir(pathToScan);
if (d)
{
while ((dir = readdir(d)) != NULL && i < *size)
{
if (dir->d_type != DT_DIR)
{
char file[PATH_MAX];
snprintf(file, sizeof(file), "%s\\%s",
pathToScan, dir->d_name);
filesName[i++] = strdup(file);
filesName[i++] = f;
}
}
closedir(d);
}
*size = i;
return filesName;
}
使用示例:
int main(void) {
int n = 10;
char **files = getFiles("/home/foo", &n);
for (int i = 0; i < n; i++) {
printf("%s\n", files[i]);
}
}