Что касается проверки файла или каталога - PullRequest
1 голос
/ 01 ноября 2010

У меня здесь очень простая программа, но, похоже, она возвращает «истинное» значение в запрос S_ISDIR (), даже если запись каталога не является каталогом.Могут ли какие-нибудь просьбы помочь мне?Я использую ОСРВ QNX Neurtion

#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <errno.h>

int main(int argc, char *argv[]) {
    DIR *dir;
    struct dirent *entry;
    struct stat eStat;
    char *root;
    int i;

    root = argv[1];

    while((entry = readdir(dir)) != NULL) {
        lstat(entry->d_name, &eStat);
        if(S_ISDIR(eStat.st_mode))
            printf("found directory %s\n", entry->d_name);
        else
            printf("not a dir\n");
    }

    return 0;
}

Пример вывода:

found directory .
found directory ..
found directory NCURSES-Programming-HOWTO-html.tar.gz
found directory ncurses_programs
found directory ncurses.html

Следующая информация может быть полезной.Сбой lstat для файла с errno, равным 2. Я не уверен, почему, может кто-нибудь это знать.

Ответы [ 3 ]

4 голосов
/ 01 ноября 2010

Просто предположение;поскольку вы не проверяете ошибку после вызова lstat, буфер eStat может содержать результат последнего успешного вызова.Попробуйте проверить, возвращает ли lstat -1.

readdir () в Linux, в корне отличается, поэтому я не могу полностью протестировать в своей системе.См. Примеры программ по тексту ссылки и тексту ссылки .Модифицируя пример кода lstat, мне кажется, это работает:


#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

int main( int argc, char **argv )
  {
    int ecode = 0;
    int n;
    struct stat sbuf;

    for( n = 1; n < argc; ++n ) {
      if( lstat( argv[n], &sbuf ) == -1 ) {
        perror( argv[n] );
        ecode++;

      } else if( S_ISDIR( sbuf.st_mode ) ) {
        printf( "%s is a dir\n", argv[n] );

      } else {
        printf( "%s is not a dir\n", argv[n] );
      }
    }
}

Я не знаю, поможет ли это.Обратите внимание, что пример кода readdir () использует opendir () как предложено schot.Но я не могу объяснить, почему ваш readdir (), кажется, работает независимо.

1 голос
/ 01 ноября 2010

Мой компилятор говорит: "предупреждение: 'dir' используется неинициализированным в этой функции" Возможно, вы захотите добавить dir = opendir(root); после инициализации root.И не забудьте добавить проверку ошибок.

Я сомневаюсь, что это вызывает вашу проблему, jcomeau_ictx , вероятно, правильно.Если lstat возвращает -1, для errno устанавливается значение, обозначающее тип ошибки.Посмотрите его справочную страницу и справочную страницу для strerror

0 голосов
/ 14 марта 2014

Несмотря на то, что этот вопрос задавался давно, и я нашел его, потому что это вопрос .но ответы здесь на самом деле не решили проблему, поэтому я решил опубликовать ответ, который я написал на другой пост , так что если у кого-то возникла такая же проблема и он использовал Google, чтобы найти эту страницу, естьчеткий ответ.

Реальная причина того, что S_ISDIR не работает должным образом, состоит в том, что dp->d_name содержит только имя файла, вам необходимо передать полный путь к файлу lstat().

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