列出目录的内容并检查元素是文件还是目录(C)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列出目录的内容并检查元素是文件还是目录(C)相关的知识,希望对你有一定的参考价值。
我一直试图找到一种方法来映射目录的内容,并检查找到的“元素”是文件还是目录。
我试过这里找到的所有“解决方案”: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'
", 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
}
它给了我以下输出:
我们可以看到,该程序检测到..和。作为dirs,但不是我目录中的单个元素。即使“另一个”和“dfgsdgf”是DIRECTORIES!
那么,为什么不将我的实际目录视为目录呢?附注:一个目录(“dfgsdgf”)为空,另一个目录(“另一个”)填充2个文件。
花了这么多时间,并尝试了大量的“工作”解决方案,我慢慢厌倦了这一点。我想详细解释为什么我的代码没有按预期工作,并且一个明确的代码片段100%工作。
PS:我的测试目录是C: test 我的exe文件不在同一目录中。
感谢,并有一个愉快的一天! 〜塞巴斯蒂安
在这里,打开opts
结构中给出的目录:
DIR *dr = opendir(opts->dirname);
opts->dirname
的内容是C: est
。但是,这里:
if ((dp = opendir(name)) != NULL) {
您尝试打开相对于您的cwd(在其他地方)的目录条目。事实上,你的_access()
检查已经失败了。
试着打电话
chdir(opts->dirname);
在你的while()
循环之前或在一个字符串中构建一个完整的路径,将它传递给你的_access()
函数中的opendir()
和df_isdirectory()
。
以上是关于列出目录的内容并检查元素是文件还是目录(C)的主要内容,如果未能解决你的问题,请参考以下文章