Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-打开并读取目录,然后确定文件类型_C_Stat_Opendir_Readdir - Fatal编程技术网

C-打开并读取目录,然后确定文件类型

C-打开并读取目录,然后确定文件类型,c,stat,opendir,readdir,C,Stat,Opendir,Readdir,好吧,我有一些问题。以下是我的代码(在此之前调用的opendir()): 我正在读取一个目录并确定其中的文件类型。唯一的问题是,这将始终打印“目录”,我相信这与对lstat的调用有关。我不确定如何适当地改变它 问题是dp->d_name只包含文件名,而不包含完整路径。所以它可能会失败,但您不会注意到,因为您没有测试它的返回值 您需要预先指定目录的路径(即,您传递给opendir)的内容。我可以看到两个明显的问题: 你没有建立正确的路径。除非您在目录中(即您确实在opendir(“.”),否则您将

好吧,我有一些问题。以下是我的代码(在此之前调用的opendir()):

我正在读取一个目录并确定其中的文件类型。唯一的问题是,这将始终打印“目录”,我相信这与对lstat的调用有关。我不确定如何适当地改变它

问题是
dp->d_name
只包含文件名,而不包含完整路径。所以它可能会失败,但您不会注意到,因为您没有测试它的返回值


您需要预先指定目录的路径(即,您传递给
opendir
)的内容。

我可以看到两个明显的问题:

  • 你没有建立正确的路径。除非您在目录中(即您确实在
    opendir(“.”
    ),否则您将错误的路径传递到
    lstat()
    。您需要将目录名与每个文件名连接起来。打开目录并不意味着将其设置为当前目录
  • 在检查其返回值之前,您不会检查
    lstat()
    是否成功

  • 您需要在文件名的路径前面加上前缀;lstat()不知道文件所在的目录。还要检查lstat()的返回值
    while( (dp = readdir(dfd)) != NULL ) {
            if( strcmp(dp->d_name, ".") == 0 ||  strcmp(dp->d_name, "..") == 0)
                continue;
    
            lstat(dp->d_name, &stbuf);
    
            printf("%s: ", dp->d_name);
    
            if( S_ISDIR(stbuf.st_mode) )
                puts("Directory");
            else if ( S_ISREG(stbuf.st_mode) )
                puts("File");
            else if ( S_ISCHR(stbuf.st_mode) )
                puts("Character Device");
            else if ( S_ISBLK(stbuf.st_mode) )
                puts("Block Device");
            else if ( S_ISFIFO(stbuf.st_mode) )
                puts("Fifo");
            else if ( S_ISLNK(stbuf.st_mode) )
                puts("Link");
            else
                puts("Socket");
        }
        return;
    }
    
    lstat(dp->d_name, &stbuf);