列出目录的内容并检查元素是文件还是目录(C)

问题描述 投票:2回答:1

我一直试图找到一种方法来映射目录的内容,并检查找到的“元素”是文件还是目录。

我试过这里找到的所有“解决方案”:How can I check if a directory exists?How do you check if a directory exists on Windows in C?Checking if a file is a directory or just a file

(因此,我的帖子不重复)

没有什么对我有用。我在Windows 10上。无论如何,我不是这些Windows库的粉丝。这就是为什么我正在寻找一种只有标准C的方法。到目前为止,这是我的代码:

struct dirent *de;
DIR *dr = opendir(opts->dirname);

#define DF_ISDIR 0x100
#define DF_ISFILE 0x200
#define DF_NOEXIST 0x400


while ((de = readdir(dr)) != NULL) {
    int exists = df_isdirectory(de->d_name);
    printf("[%s]: '%s'\n", exists == DF_ISDIR ? "DIR" : exists == DF_ISFILE ? "FILE" : "WHATEVER", de->d_name);
}

int df_isdirectory(const char *name) {
assert(name != NULL);

DIR *dp = NULL;
if (_access(name, F_OK) == 0) {
    if ((dp = opendir(name)) != NULL) {
        closedir(dp);
        return DF_ISDIR; //  element is directory
    } else {
        return DF_ISFILE; // element is a file
    }
}

return DF_NOEXIST; // element is whatever

}

它给了我以下输出:

enter image description here

我们可以看到,该程序检测到..和。作为dirs,但不是我目录中的单个元素。即使“另一个”和“dfgsdgf”是DIRECTORIES!

enter image description here

那么,为什么不将我的实际目录视为目录呢?附注:一个目录(“dfgsdgf”)为空,另一个目录(“另一个”)填充2个文件。

花了这么多时间,并尝试了大量的“工作”解决方案,我慢慢厌倦了这一点。我想详细解释为什么我的代码没有按预期工作,并且一个明确的代码片段100%工作。

PS:我的测试目录是C:\ test 我的exe文件不在同一目录中。

感谢,并有一个愉快的一天! 〜塞巴斯蒂安

c directory filesystems
1个回答
1
投票

在这里,打开opts结构中给出的目录:

DIR *dr = opendir(opts->dirname);

opts->dirname的内容是C:\test。但是,这里:

if ((dp = opendir(name)) != NULL) {

您尝试打开相对于您的cwd(在其他地方)的目录条目。事实上,你的_access()检查已经失败了。

试着打电话

chdir(opts->dirname);

在你的while()循环之前或在一个字符串中构建一个完整的路径,将它传递给你的_access()函数中的opendir()df_isdirectory()

© www.soinside.com 2019 - 2024. All rights reserved.