这是一段看起来很奇怪的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有问题(阅读DT_DIR),但我不知道该怎么做。
怎么回事?为什么DT_DIR不忽略文件夹?
我将大小理解为要返回的文件数量的限制。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("%sn", files[i]);
}
}