Текущий рабочий каталог

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

do { char *filename = entry->d_name; stat(filename,&buffer); if (S_ISDIR(buffer.st_mode)) { name = entry->d_name; chdir(name); if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; listdir(name); //THIS IS THE NAME OF THE FUNCTION THAT THIS SNIPPET IT FROM! chdir(".."); } else printf("%s\t%d\n", entry->d_name,buffer.st_size); 

Я так смущен, пытаясь достать его в каталог в каталог, с которым он сталкивается! ARGH!

    Проблема, когда я выполнил, был stat() не удалось.

    Это сработало для меня:

     #include  #include  #include  #include  #include  #include  #include  #include  #include  void listdir(const char* const name); int main(void) { listdir(getenv("PWD")); return 0; } void listdir(const char* const name) { DIR *dir; struct dirent *entry; struct stat buffer; char* path = 0; if (!(dir = opendir(name))) return; if (!(entry = readdir(dir))) return; do { path = malloc((strlen(name) + strlen(entry->d_name) + 2) * sizeof(char)); sprintf(path, "%s/%s", name, entry->d_name); if (-1 == stat(path,&buffer)) { fprintf(stderr, "stat(%s) failed: %s\n", path, strerror(errno)); exit(1); } else if (S_ISDIR(buffer.st_mode)) { if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) { listdir(path); } } else { printf("%s\t%d\n", path, buffer.st_size); } free(path); } while (entry = readdir(dir)); closedir(dir); } 

    РЕДАКТИРОВАТЬ:

    Убрано обращение к chdir() как это было реализовано, было излишним. Это делает листинг, но не делает это с помощью chdir() .

    Во-первых, вы должны использовать lstat . Во-вторых, с вашим вызовом chdir(name) вы фактически переходите в родительские режимы (когда name = “..”), но никогда не возвращайтесь.

    Проблемы лежат в этом коде:

     if (S_ISDIR(buffer.st_mode)) { name = entry->d_name; chdir(name); if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; listdir(name); //THIS IS THE NAME OF THE FUNCTION THAT THIS SNIPPET IT FROM! chdir(".."); } 

    Это встроено в цикл do-while, но вы не показываете нам, как читается запись в каталоге.

    Условия strcmp() должны применяться к текущему каталогу перед выполнением chdir() ; это «опасная» операция. Когда вы уверены, что вам нужно обработать каталог, вы можете сделать chdir() , открыть новый stream каталога и обработать записи из нового streamа – это, вероятно, рекурсивный вызов, а затем chdir() снова. Ваш прыжок после того, как вы сделали chdir(..) (потому что вы не проверяли .. перед тем, как делать chdir(name) ), это навлечет на себя хаос.

    Вы должны искать fchdir() который может быть лучше с целью вернуться туда, где вы начали.