Функция stat() не возвращает правильный результат

у меня есть эта функция

long processFile(char * fileName)
{
    struct stat statBuf;
    mode_t mode;
    int result;
    result = stat(fileName, &statBuf);
    if (result == -1);
        return -1;
    if(S_ISDIR(mode))
        return(processDirectory(fileName));
    else
        return 1;
}

Если «fileName» является реальным файлом, я хочу, чтобы он возвращал его, но если «fileName» — это каталог, я хочу, чтобы он перешел к моей функции с именем processDirectory. По какой-то причине, что бы я ни делал, вызов stat() продолжает возвращать -1. Я попытался жестко закодировать имя файла, например «test.txt», и каталог с именем «/test», которые оба находятся в том же каталоге, что и мой исполняемый файл. Любое руководство будет оценено.


person AlwaysLearning    schedule 17.03.2014    source источник
comment
Значение errno равно?   -  person Ignacio Vazquez-Abrams    schedule 17.03.2014
comment
эээ? @ИгнасиоВазкес-Абрамс   -  person AlwaysLearning    schedule 17.03.2014
comment
Да. Точно так же, как сказано в разделе ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ на справочной странице stat(2).   -  person Ignacio Vazquez-Abrams    schedule 17.03.2014
comment
заменить return -1; на { perror("stat"); return -1; };   -  person Basile Starynkevitch    schedule 17.03.2014
comment
... или (более поучительно): {fprintf(stderr, "stat() failed: %s\n", strerror(errno)); return -1;} @BasileStarynkevitch   -  person alk    schedule 17.03.2014
comment
Я заменил result = stat(fileName, &statBuf); if (result == -1);return -1; на if(stat(fileName, &statBuf) == -1){ perror("stat() error "); return -1; } и теперь все работает. Спасибо всем за помощь.   -  person AlwaysLearning    schedule 17.03.2014
comment
Ого, сколько здесь слепоты... см. мой ответ.   -  person Jim Balter    schedule 17.03.2014
comment
теперь это работает - потому что вы удалили поддельный ; после оператора if, а не из-за вызова perror.   -  person Jim Balter    schedule 17.03.2014
comment
Кстати, вы в хорошей компании с этой ошибкой - Google goto не работает.   -  person Jim Balter    schedule 17.03.2014
comment
заменить возврат -1; с { ошибка (статистика); возврат -1; }; -- на самом деле, эта точная замена всегда будет возвращать -1, а также добавит еще одну поддельную ;.   -  person Jim Balter    schedule 17.03.2014
comment
Компилятор ошибается, операционная система возвращает неправильные результаты, которые, по моему обширному опыту, верны один раз на миллион или около того.   -  person vonbrand    schedule 17.03.2014
comment
@vonbrand Да, как только я увидел это название, я понял, что его автор — новичок. Мы получаем много этого здесь. С опытом приходит смирение, по крайней мере, в этой области — ошибки почти всегда наши собственные, мы способны на самые разные из них и часто совершенно не замечаем их. (В данном случае я увидел точку с запятой за долю секунды, глядя на код, но я потратил на это 40 лет.)   -  person Jim Balter    schedule 17.03.2014
comment
@JimBalter Во-первых, я просто хочу поблагодарить за то, что нашел мою опечатку. Кроме того, как бы вы предложили мне сформулировать заголовок, чтобы показать смирение перед таким опытным человеком?   -  person AlwaysLearning    schedule 18.03.2014
comment
Первое, что нужно сделать, это проверить утверждение, запустив отладчик или введя printf значения, которое на самом деле возвращает stat. Что касается заголовка, статистика не возвращает ожидаемое значение, чтобы избежать намека на ее неисправность.   -  person Jim Balter    schedule 19.03.2014


Ответы (2)


if (result == -1);
    return -1;

Уберите точку с запятой в первой строке.

person Jim Balter    schedule 17.03.2014
comment
Да, то же самое касается Apple: zdnet.com/ - person Jim Balter; 17.03.2014

Судя по вашему сообщению, может быть какая-то проблема с безопасностью пользователя или у каталога пути может не быть соответствующей авторизации для поиска. В любом случае, вы можете провести быстрое тестирование с помощью команды «stat» и проверить, работает ли она.

$ stat имя файла.txt

Да errno во время возврата stat() -1 было бы полезно понять, почему этот системный вызов не работает.

person Mantosh Kumar    schedule 17.03.2014
comment
Помимо того, что я не понимаю правильной проблемы (см. Мой ответ), это вообще не ответ, это комментарий. Пожалуйста, оставляйте комментарии как комментарии (теперь у вас достаточно представителей для этого), а не как ответы. - person Jim Balter; 17.03.2014