Прохождение через каталоги в C

Я пытаюсь пройти через каталог, путь которого указан, но следующая программа не входит в каталоги и застревает в бесконечном цикле. В чем проблема в этом коде:

void func(char path[]); int main(int argc, char *argv) { char buf[255]; getcwd(buf,255); func(buf); } void func(char path[]) { DIR *dirp; struct stat states; struct dirent *direntp; dirp=opendir(path); chdir(path); while((direntp=readdir(dirp))!=NULL) { if(S_ISDIR(states.st_mode))//true than returns zero { printf("%s\n",direntp->d_name); } else if(!(strcmp(direntp->d_name,".")||strcmp(direntp->d_name,"..")))// if true retrns zero { continue; } else { func(direntp->d_name); chdir(".."); } } } 

Вы можете проверить, является ли узел каталогом без вспомогательных states . struct dirent имеет поле, называемое d_type , AND оно с DT_DIR для проверки, является ли это каталогом.

Вам либо не хватает кода, либо проблема в том, что вы никогда не заполняете / обновляете states .

Также посмотрите еще раз на эту строку:

 if(!(strcmp(direntp->d_name,".")||strcmp(direntp->d_name,".."))) 

Он никогда не будет оценивать истинное значение, так как для direntp->d_name требуется равное значение . и .. в то же время (что просто невозможно). Я предполагаю, что вы хотели проверить с помощью && здесь, который будет вводить только ветку, если ваше имя каталога соответствует любому значению.

В этом fragmentе вашего кода states не инициализируются до его использования:

 struct stat states; struct dirent *direntp; dirp=opendir(path); chdir(path); while((direntp=readdir(dirp))!=NULL) { if(S_ISDIR(states.st_mode))//true than returns zero в struct stat states; struct dirent *direntp; dirp=opendir(path); chdir(path); while((direntp=readdir(dirp))!=NULL) { if(S_ISDIR(states.st_mode))//true than returns zero 

Я думаю, что компилятор тоже предупредил об этом, поэтому, пожалуйста, -W -Wall предупреждение в своем компиляторе ( -W -Wall для gcc), а затем прислушайтесь и исправьте предупреждения.