2013-09-16 2 views
0
#include "stdlib.h" 
#include "sys/stat.h" 
#include "stdio.h" 

int main(){ 
    struct stat s; 
    lstat("../", &s); 
    if(S_ISDIR(s.st_mode) == 0){ 
      printf("yes\n"); 
    }else{ 
      printf("no\n"); 
    } 
} 

Результат: «нет»C: Почему S_ISDIR не распознает каталог? не

Когда я запускать различные вариации этого кода (например, с S_ISREG) Я получаю противоположное тому, что я ожидаю каждый раз. Поэтому для S_ISREG с «../» я получаю «да». Я некоторое время возился с подобными вещами (разрешения на файлы, создание каталога и т. Д.), Поэтому я не знаю, что я что-то напортачил или что-то в этом роде. Любая помощь будет оценена по достоинству.

+0

Это должен быть ответ. –

+0

Что это значит? Как в этом должно работать, или это в настоящее время дает мне правильный ответ? – user2784872

+0

@ user2784872: Я прокомментировал перед отправкой ответа, R имел в виду это. – Mat

ответ

0

Вы используете S_ISDIR неправильно. Это будет оценено до true, если у вас есть каталог, вы тестируете нулевое значение, которое равно false.

Заменить, что с:

if(S_ISDIR(s.st_mode)){ 
     printf("yes\n"); 
}else{ 
     printf("no\n"); 
} 

То же самое для других макросов, как S_ISREG.

Стандартная ссылка для этих макросов POSIX, который говорит, что это в sys/stat.h:

Следующие макросы должны быть предоставлены, чтобы проверить, является ли файл указанного типа. Значение m, заданное для макросов, представляет собой значение st_mode из структуры stat. Макрос должен вычислять ненулевое значение, если проверка истинна; 0, если тест ложный.

[...]
S_ISDIR(m)
  Test для каталога.
[...]

+0

Я не говорю, что я тебе не верю, но он работал раньше. Также man-страницы, а также [this] (http://linux.die.net/man/2/stat) говорят, что нуль возвращается, если true. – user2784872

+0

Где на этой странице он говорит, что он возвращает 0? Добавлена ​​официальная стандартная ссылка, если у вас все еще есть сомнения. – Mat

+0

Ничего себе. Виноват. Я догадался, что приписал возвращаемое значение макросам ... как идиот. Спасибо. – user2784872

Смежные вопросы