对文件或目录的关于检查(Regarding checking for file or directo

2019-09-27 04:32发布

我有一个非常简单的程序,在这里,但它似乎是一个“真”值被返回到查询S_ISDIR(),即使目录项不在一个目录。 任何一个pleeas能帮助我。 我使用的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.我不知道为什么,任何人可以知道这一点。

Answer 1:

只是一种猜测; 因为你不是一个错误的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()作为散粒建议。 但我无法解释为什么你的readdir()似乎无论工作。



Answer 2:

我的编译器说:“警告:‘目录’被用来在这个函数初始化”你可能需要添加dir = opendir(root); 后初始化root 。 而且不要忘记添加一些错误检查。

我怀疑这会导致你的问题, jcomeau_ictx可能是正确的。 如果lstat返回-1它设置errno到表示错误类型的值。 看它的手册页和手册页strerror



Answer 3:

虽然这个问题被问很久以前,我发现它,因为这quesion 。 但答案在这里并没有真正解决问题,所以我决定后,我写上了答案另一篇文章 ,这样如果任何人有同样的问题,使用谷歌找到这个页面,有一个明确的答案。

真正的原因S_ISDIR无法按预期工作是dp->d_name包含文件的唯一名称,则需要通过文件的完整路径lstat()



文章来源: Regarding checking for file or directory
标签: c posix