У меня возникли проблемы с попыткой реализовать что-то вроде ls -R на C. Дело в том, что мне нужно, чтобы список рекурсивно отображал все, начиная с заданного каталога, а затем делал материал с этими обычными файлами, которые я получаю из списка , Это то, что я до сих пор:Рекурсивный листинг
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");
}
}
Это не работает на всех, она показывает файлы, которые даже не в папке я работаю с. Любые мысли? Спасибо.
Это обычная проблема при работе с файлами/каталогами. 'd_name' не полный путь. Таким образом, вы не можете 'stat', если только ваш текущий каталог не является тем, который содержит этот файл/каталог. 'opendir' не изменяет ваш текущий каталог. 'chdir' нужно вызвать перед вызовом' stat'. Или создать полное имя пути. – kaylum
Вам также нужно отфильтровать записи '.' и' ..'. В противном случае вы закончите бесконечную рекурсию. – kaylum
Это решает проблему бесконечной рекурсии, но я не могу заставить ее работать, разве я не строил полный путь уже с этим? 'char * buf = malloc (strlen (path) + strlen (filei-> d_name) +2);' 'strcpy (buf, path);' 'strcat (buf,"/");' 'strcat (buf, filei-> d_name); ' – Stieg