Элемент d_name
в struct dirent
является базовым именем рассматриваемого элемента. Итак, если вы просматриваете каталог, подобный этому:
.
..
where-is/
pancakes/
.
..
house
Попав в where-is
, вы попытаетесь listdir("pancakes")
, но это не сработает, потому что вам нужно listdir("where-is/pancakes")
.
Вам нужно объединить это с именем каталога, который вы ищете, прежде чем у вас будет что-то, что вы можете передать на следующий listdir
вызов.
Вы захотите заменить такие вещи:
listdir(mydirent->d_name);
с такими вещами:
char *next_dir = malloc(strlen(argv[n]) + strlen(mydirent->d_name) + 1 + 1);
sprintf(next_dir, "%s/%s", argv[n], mydirent->d_name);
listdir(next_dir);
free(next_dir);
В качестве альтернативы, вы можете chdir
в каталогах, когда вы вводите их, а затем chdir
создавать резервные копии, когда вы закончите.