Список только обычных файлов, проблема со статистикой - PullRequest
1 голос
/ 06 июня 2011

Я хочу перечислить обычные файлы в каталоге. Тем не менее, stat не удается для каждого файла.

DIR* dp = NULL;
struct dirent* entry = NULL;
dp = opendir(directory);

if (!dp) { log_err("Could not open directory"); return -1; }

while (entry = readdir(dp))
{
    struct stat s;
    char path[1024]; path[0] = 0;
    strcat(path, directory);
    strcat(path, entry->d_name);

    int status = 0;

    if (status = stat(path, &s))
    {
        if (S_ISREG(s.st_mode))
        {
            printf("%s\n", entry->d_name);
        }
    }
    else
    {
        fprintf(stderr, "Can't stat: %s\n", strerror(errno));
    }
}

closedir(dp);

Выход

Невозможно стат: Ресурс временно недоступен

Невозможно стат: Ресурс временно недоступен * * +1010

Невозможно стат: Ресурс временно недоступен

(... много раз)

errno установлено на E_AGAIN (11).

Теперь, если я напечатаю получившиеся path, они действительно будут действительными именами файлов и каталогов. Каталог доступен для чтения, у пользователя, с которым я работаю, есть права на это (это каталог, в котором я пишу программу).

В чем причина этой проблемы и как я могу сделать это правильно?

Ответы [ 2 ]

3 голосов
/ 06 июня 2011

stat и многие другие системные вызовы возвращают 0 в случае успеха и -1 в случае ошибки. Вы неправильно проверяете возвращаемое значение stat.

Ваш код должен быть:

if (!stat(path, &s))
{
    if (S_ISREG(s.st_mode))
    {
        printf("%s\n", entry->d_name);
    }
}
else
{
    fprintf(stderr, "Can't stat: %s\n", strerror(errno));
}
0 голосов
/ 06 июня 2011

Возможно, вам не хватает разделителя.

strcat(path, directory);
strcat(path, "/"); //this is missing
strcat(path, entry->d_name);

Не забудьте учесть дополнительные '/' при выделении вашей строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...