【问题标题】:How to determine files and directories in parent/other directories如何确定父/其他目录中的文件和目录
【发布时间】:2013-04-03 00:21:49
【问题描述】:

我发现另一个问题here 的答案非常有帮助。

sys/stat.h 库似乎有一个限制,因为当我尝试查看其他目录时,所有内容都被视为一个目录。

我想知道是否有人知道另一个系统功能,或者为什么它将当前工作目录之外的任何东西都视为一个目录。

感谢任何人提供的任何帮助,因为这让我感到困惑,而且各种搜索都没有任何帮助。

我用来测试的代码是:

#include <sys/stat.h>
#include <dirent.h>
#include <stdio.h>

int main(void) {

        int status;

        struct stat st_buf;
        struct dirent *dirInfo;

        DIR *selDir;
        selDir = opendir("../");
                                    // ^ or wherever you want to look
        while ((dirInfo = readdir(selDir))) {

                status = stat (dirInfo->d_name, &st_buf);

                if (S_ISREG (st_buf.st_mode)) {
                        printf ("%s is a regular file.\n", dirInfo->d_name);
                }
                if (S_ISDIR (st_buf.st_mode)) {
                        printf ("%s is a directory.\n", dirInfo->d_name);
                }

        }

        return 0;

}

【问题讨论】:

  • 在使用结果之前,您应该检查来自 opendir()stat() 的返回值。当然,您也应该在完成后致电closedir()

标签: c file directory


【解决方案1】:

如果您打印出 stat,您会注意到有一个错误(找不到文件)。

这是因为 stat 获取文件的路径,但您只是提供文件名。 然后对垃圾值调用 IS_REG。

所以,假设您有一个文件 ../test.txt 您在 test.txt 上调用 stat...它不在目录 ./test.txt 中,但您仍然从 IS_REG 打印出结果。

【讨论】:

    【解决方案2】:

    您需要检查stat调用的状态;它失败了。

    问题是您在当前目录中查找文件the_file,而实际上它只在../the_file 中找到。 readdir() 函数为您提供相对于其他目录的名称,但 stat() 适用于当前目录。

    要使其正常工作,您必须执行以下操作:

    char fullname[1024];
    
    snprintf(fullname, sizeof(fullname), "%s/%s", "..", dirInfo->d_name);
    
    if (stat(fullname, &st_buf) == 0)
        ...report on success...
    else
        ...report on failure...
    

    【讨论】:

    • 效果很好。您能否推荐一个 if 条件来检查我是否正在查找可与 argv[] 一起使用的当前目录?
    • 除非当前目录是根目录/,否则您的readdir() 正在查看"../" 意味着您的名字不在当前目录中。如果目录名是".",那就简单了。假设您需要创建复合名称是最简单的;这将永远有效。如果您不想这样做,那么stat(".", &amp;sb1)stat(dirname, &amp;sb2) 并比较st_inost_dev 以确保它们在sb1sb2 中相同可能是最好的测试。跨度>
    • (顺便说一下,文件所有目录的原因是条目".."出现在两个目录中;失败的stat()调用不会改变st_buf变量,所以所有文件都出现了是同一个目录(其中包含当前目录中.. 目录的详细信息)。
    猜你喜欢
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 2014-09-03
    相关资源
    最近更新 更多