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

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

0 голосов
/ 11 декабря 2011

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

Я так растерялся, пытаясь вставить его в каталог cd, что обнаружил! ARGH!

Ответы [ 3 ]

1 голос
/ 11 декабря 2011

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

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

#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

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);
}

EDIT:

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

0 голосов
/ 11 декабря 2011

Проблемы заключаются в этом коде:

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

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

0 голосов
/ 11 декабря 2011

Во-первых, вы должны использовать lstat.Во-вторых, при вызове chdir(name) вы на самом деле делаете переходите в родительские директории (когда name = ".."), но никогда не возвращаетесь обратно.

...