递归列表
Recursive listing
我一直在尝试在 C 上实现类似 ls -R 的东西时遇到问题,问题是我需要 list 递归地列出从给定目录开始的所有内容,然后用我从列表中获得的那些常规文件做一些事情.
这是我目前所拥有的:
void ls(char* path){
DIR *directory;
struct dirent *filei;
struct stat stats;
directory = opendir(path);
if (directory != NULL)
{
while ((filei=readdir(directory))!=NULL){
stat(filei->d_name, &stats);
printf(" %s\n", filei->d_name);
if (S_ISDIR(stats.st_mode)){
char *buf = malloc(strlen(path)+strlen(filei->d_name)+2);
strcpy(buf,path);
strcat(buf,"/");
strcat(buf,filei->d_name);
ls(buf);
}
}
closedir(directory);
}
else{
printf("Error.\n");
}
}
它根本不起作用,它显示的文件甚至不在我正在使用的文件夹中。
有什么想法吗?
谢谢
你不能递归到“。”和“..”条目。您至少会无限递归到同一个目录,或者 up 很糟糕。过滤器:
if (!strcmp(filei->d_name,".") && (!strcmp(filei->d_name,"..")) ls(buf);
您还必须 stat
进入完整路径:
char *buf = malloc(strlen(path)+strlen(filei->d_name)+2);
strcpy(buf,path);
strcat(buf,"/");
strcat(buf,filei->d_name);
stat(buf, &stats);
if (S_ISDIR(stats.st_mode)) {
if (!strcmp(filei->d_name,".") && (!strcmp(filei->d_name,"..")) {
ls(buf);
}
}
您的代码的以下返工在完整文件路径上调用 stat()
,跳过“.”和“..”目录,修复了内存泄漏并添加了一些错误处理:
#define SEPARATOR "/"
void ls(const char *path)
{
DIR *directory = opendir(path);
if (directory != NULL)
{
struct dirent *filei;
while ((filei = readdir(directory)) != NULL)
{
if (strcmp(filei->d_name, ".") == 0 || strcmp(filei->d_name, "..") == 0)
{
continue;
}
char *buffer = malloc(strlen(path) + strlen(filei->d_name) + strlen(SEPARATOR) + 1);
strcat(strcat(strcpy(buffer, path), SEPARATOR), filei->d_name);
struct stat stat_buffer;
if (stat(buffer, &stat_buffer) == 0)
{
printf("%s\n", buffer);
if (S_ISDIR(stat_buffer.st_mode))
{
ls(buffer);
}
}
else
{
perror(NULL);
}
free(buffer);
}
closedir(directory);
}
else
{
perror(NULL);
}
}
看看它是否更适合您。
我一直在尝试在 C 上实现类似 ls -R 的东西时遇到问题,问题是我需要 list 递归地列出从给定目录开始的所有内容,然后用我从列表中获得的那些常规文件做一些事情. 这是我目前所拥有的:
void ls(char* path){
DIR *directory;
struct dirent *filei;
struct stat stats;
directory = opendir(path);
if (directory != NULL)
{
while ((filei=readdir(directory))!=NULL){
stat(filei->d_name, &stats);
printf(" %s\n", filei->d_name);
if (S_ISDIR(stats.st_mode)){
char *buf = malloc(strlen(path)+strlen(filei->d_name)+2);
strcpy(buf,path);
strcat(buf,"/");
strcat(buf,filei->d_name);
ls(buf);
}
}
closedir(directory);
}
else{
printf("Error.\n");
}
}
它根本不起作用,它显示的文件甚至不在我正在使用的文件夹中。 有什么想法吗? 谢谢
你不能递归到“。”和“..”条目。您至少会无限递归到同一个目录,或者 up 很糟糕。过滤器:
if (!strcmp(filei->d_name,".") && (!strcmp(filei->d_name,"..")) ls(buf);
您还必须 stat
进入完整路径:
char *buf = malloc(strlen(path)+strlen(filei->d_name)+2);
strcpy(buf,path);
strcat(buf,"/");
strcat(buf,filei->d_name);
stat(buf, &stats);
if (S_ISDIR(stats.st_mode)) {
if (!strcmp(filei->d_name,".") && (!strcmp(filei->d_name,"..")) {
ls(buf);
}
}
您的代码的以下返工在完整文件路径上调用 stat()
,跳过“.”和“..”目录,修复了内存泄漏并添加了一些错误处理:
#define SEPARATOR "/"
void ls(const char *path)
{
DIR *directory = opendir(path);
if (directory != NULL)
{
struct dirent *filei;
while ((filei = readdir(directory)) != NULL)
{
if (strcmp(filei->d_name, ".") == 0 || strcmp(filei->d_name, "..") == 0)
{
continue;
}
char *buffer = malloc(strlen(path) + strlen(filei->d_name) + strlen(SEPARATOR) + 1);
strcat(strcat(strcpy(buffer, path), SEPARATOR), filei->d_name);
struct stat stat_buffer;
if (stat(buffer, &stat_buffer) == 0)
{
printf("%s\n", buffer);
if (S_ISDIR(stat_buffer.st_mode))
{
ls(buffer);
}
}
else
{
perror(NULL);
}
free(buffer);
}
closedir(directory);
}
else
{
perror(NULL);
}
}
看看它是否更适合您。