我这里有一个非常简单的程序,但它似乎正在返回
查询S}ISDIR()的“true”值,即使目录
条目不是目录。有人能帮我吗。我用的是QNX神经活动区

#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。我不知道为什么会有人知道。

最佳答案

只是一个猜测;由于在lstat调用之后没有检查错误,eStat缓冲区可能包含上次成功调用的结果。尝试检查lstat是否返回-1。
Linux上的readdir()与之根本不同,因此我无法在系统上进行完全测试。参见link textlink text中的示例程序。修改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()示例代码使用了schot建议的opendir()。但我无法解释为什么readdir()看起来工作正常。

关于c - 关于检查文件或目录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4068136/

10-12 00:21