【问题标题】:C - open and read directory, then determine file typeC - 打开并读取目录,然后确定文件类型
【发布时间】:2012-07-03 01:53:18
【问题描述】:

好的,所以我遇到了一些问题。这是我的代码(在此之前调用了 opendir()):

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 的调用有关。我不完全确定如何适当地改变它。

【问题讨论】:

  • 您需要在文件名前面加上路径; lstat() 不知道文件在哪个目录。还要检查 lstat() 的返回值

标签: c stat opendir readdir


【解决方案1】:
lstat(dp->d_name, &stbuf);

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

您需要添加目录的路径(即,您传递给opendir 的内容)。

【讨论】:

    【解决方案2】:

    我可以看到两个明显的担忧原因:

    1. 您没有构建正确的路径。除非您在 目录中(即您执行了opendir(".")),否则您将错误的路径传递给lstat()。您需要将目录名称与每个文件的名称连接起来。打开目录并不意味着将其设为当前目录。
    2. 在检查其返回值之前,您没有检查 lstat() 是否成功。

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多