C 关于检查文件或目录

C 关于检查文件或目录,c,posix,C,Posix,我这里有一个非常简单的程序,但它似乎正在返回 即使在目录 条目不是目录。有人能帮我吗。我正在使用QNX Neurotion RTOS #include <stdio.h> #include <dirent.h> #include <sys/stat.h> #include <errno.h> int main(int argc, char *argv[]) { DIR *dir; struct dirent *entry;

我这里有一个非常简单的程序,但它似乎正在返回 即使在目录 条目不是目录。有人能帮我吗。我正在使用QNX Neurotion RTOS

#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;
}
以下信息可能会有所帮助。
文件的lstat失败,errno设置为2。我不知道为什么,有人知道吗。

只是猜测;由于在lstat调用后没有检查错误,因此eStat缓冲区可能包含上次成功调用的结果。尝试检查lstat是否返回-1

Linux上的readdir是完全不同的,所以我无法在我的系统上完全测试。请参阅和上的示例程序。修改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看起来无论如何都能工作。

只是一个猜测;由于在lstat调用后没有检查错误,因此eStat缓冲区可能包含上次成功调用的结果。尝试检查lstat是否返回-1

Linux上的readdir是完全不同的,所以我无法在我的系统上完全测试。请参阅和上的示例程序。修改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看起来可以正常工作。

我的编译器说:警告:“dir”在这个函数中未初始化使用,您可能需要添加dir=opendirroot;在初始化root之后。别忘了添加一些错误检查

我怀疑这会导致你的问题,也许是对的。如果lstat返回-1,它会将errno设置为表示错误类型的值。查看它的手册页和strerror的手册页

我的编译器说:警告:“dir”在这个函数中未初始化使用,您可能需要添加dir=opendirroot;在初始化root之后。别忘了添加一些错误检查


我怀疑这会导致你的问题,也许是对的。如果lstat返回-1,它会将errno设置为表示错误类型的值。看看它的手册页和strerror的手册页

,尽管这个问题很久以前就被问到了,我发现它是因为。但是这里的答案并没有真正解决问题,所以我决定把我写在上面的答案贴出来,这样如果有人有同样的问题,并且使用谷歌搜索这个页面,就会有一个明确的答案


S_ISDIR无法按预期工作的真正原因是dp->d_name只包含文件名,您需要将文件的完整路径传递给lstat。

即使这个问题很久以前就被问到了,我发现它是因为。但是这里的答案并没有真正解决问题,所以我决定把我写在上面的答案贴出来,这样如果有人有同样的问题,并且使用谷歌搜索这个页面,就会有一个明确的答案


S_ISDIR不能按预期工作的真正原因是dp->d_name只包含文件名,您需要将文件的完整路径传递给lstat。

是的,您是对的,lstat返回文件失败,我不确定它返回失败的原因,请您帮助我如果lstatentry->d_name,&eStat=-1 perroentry->d_name;是的,你是对的,文件返回失败,我不知道为什么返回失败,你能帮我吗;