Я пытаюсь пройти через каталог, путь которого указан, но следующая программа не входит в каталоги и застревает в бесконечном цикле. В чем проблема в этом коде:
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), а затем прислушайтесь и исправьте предупреждения.