У меня есть функция, которая считывает все файлы, содержащиеся в одном каталоге ввода.
Я хотел, чтобы эта функция читала не только файлы в «основном» каталоге, но и те, которые содержатся во всех подкаталогах.C - файлы с листингами, содержащиеся в папке и во всех подпапках
Для того, чтобы сделать это, я написал этот код:
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
struct dirent *readdir(DIR *dirp);
char * percorso;
DIR *cartella;
struct dirent *elemento;
char * scrivi(char * a, char * b)
{
char *targetdir = malloc(2048);
strcpy(targetdir,a);
strcat(targetdir,"/");
strcat(targetdir,b);
printf("%s \n", targetdir);
return targetdir;
}
void scorriFolder(char* nome)
{
if ((cartella = opendir(nome)) == NULL)
perror("opendir() error");
else {
printf("contents of root: \n");
while ((elemento = readdir(cartella)) != NULL)
{
if(elemento->d_type == DT_DIR)
{
if(elemento->d_name != ".." || elemento->d_name != ".")
{
percorso = scrivi(nome, elemento->d_name);
scorriFolder(percorso);
}
}
else
{
printf(" %s\n", elemento->d_name);
}
}
closedir(cartella);
}
}
main(int argc, char * argv[]) {
scorriFolder(argv[1]);
}
Но это даже не обобщать, говоря:
warning: incompatible implicit declaration of built-in function ‘malloc’
warning: incompatible implicit declaration of built-in function ‘strcpy’
warning: incompatible implicit declaration of built-in function ‘strcat’
Насколько я знаю, этот вопрос из-за неправильный формат переменных, переданных в malloc
, strcpy
и strcat
функции. (elemento->d_name
имеет тип char
и не char*
Что я могу сделать для того, чтобы получить этот код работать
Благодаря
EDIT
Это рабочий while
фрагмент кода:.
while ((elemento = readdir(cartella)) != NULL)
{
if (strcmp(elemento->d_name, ".") == 0)
{
continue;
}
if (strcmp(elemento->d_name, "..") == 0)
{
continue;
}
if(elemento->d_type == DT_DIR)
{
{
percorso = scrivi(nome, elemento->d_name);
scorriFolder(percorso);
}
}
else
{
printf(" %s\n", elemento->d_name);
}
}
После этого sc ans подкаталог он сбой, потому что путь не обновляется по мере выхода программы из подкаталога. Я пытаюсь это исправить.
' elemento-> d_name! = ".." 'use strcmp – BLUEPIXY
Я сделал это. Теперь есть еще одна проблема, но я пытаюсь ее исправить самостоятельно. Если я не справлюсь, я попрошу здесь еще раз: D –
Если ваша система UNIX смотрит на 'fts()' и устаревшие функции 'ftw()'. Поскольку они выполняют большую часть работы по иерархии файлов. –