Что касается проверки файла или каталога

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

#include  #include  #include  #include  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. Я не уверен, почему, может кто-нибудь это знает.

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

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

 #include  #include  #include  #include  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 (), похоже, работает независимо.

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

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

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

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