【问题标题】:C faster way to check if a directory existsC检查目录是否存在的更快方法
【发布时间】:2012-03-08 01:06:36
【问题描述】:

我正在使用 opendir 函数来检查目录是否存在。问题是我在一个巨大的循环中使用它并且它膨胀了我的应用程序使用的内存。

在 C 中检查目录是否存在的最佳(最快)方法是什么?如果不存在,创建它的最佳(最快)方法是什么?

【问题讨论】:

  • 愚蠢的问题,你后来打电话给closedir()吗?
  • 更快的方法可能是异步执行,但您应该考虑媒体的功能。如果它是普通硬盘,那么它可能无法进入搜索风暴,这将运行缓慢。但如果您使用 RAID/SSD 甚至在云中工作,这将起作用。

标签: c performance mkdir opendir


【解决方案1】:

您可以致电mkdir()。如果该目录不存在,则会创建该目录并返回0。如果目录存在,则返回-1,并将errno 设置为EEXIST

【讨论】:

  • 需要注意的是ENOENT 如果路径上的某些东西也不存在,则可能会发生。
  • 是的。应该提到这一点。
  • 因为如果目录不存在,您想创建目录:是的。你保存了一个stat() 电话。
  • 请注意,您需要包含 (用于 mkdir)和 (用于处理 errnoEEXIST)。
  • 但是请注意,如果您不想创建目录(但仅根据问题的前半部分检查是否存在),那么 mkdir 会花费您 I/O(可能会同步,对系统上的其他参与者造成更大的 I/O 性能损失)并且可能由于与存在无关的原因(例如当前帐户的权限、挂载选项 (R/O FS) 或可用的文件系统空间或配额)而失败。跨度>
【解决方案2】:

我更喜欢使用access()

if (0 != access("/path/to/possible_dir/", F_OK)) {
  if (ENOENT == errno) {
     // does not exist
  }
  if (ENOTDIR == errno) {
     // not a directory
  }
}

如果您确保目录名称中有一个尾随 /,则此方法非常有效。

【讨论】:

【解决方案3】:

听起来你有内存泄漏。只要您记得在成功打开目录后始终调用 closedir,调用 opendir 就不会增加应用程序的 RAM。此外,请确保您正在释放分配用于计算目录名称的所有缓冲区。

【讨论】:

  • 是的,我正在关闭它,我将只使用 stat,感谢您的时间!
【解决方案4】:

考虑使用statS_ISDIR(s.st_mode) 会告诉你它是否是一个目录。

示例:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

...
struct stat s;
int err = stat("/path/to/possible_dir", &s);
if(-1 == err) {
    if(ENOENT == errno) {
        /* does not exist */
    } else {
        perror("stat");
        exit(1);
    }
} else {
    if(S_ISDIR(s.st_mode)) {
        /* it's a dir */
    } else {
        /* exists but is no dir */
    }
}
...

【讨论】:

  • 与 opendir 相比,它的速度有多快?
  • 这取决于操作系统和父目录中的条目数。它会以任何方式更快,这就是 stat 的用途。
  • lstat 也是一种选择吗?
  • @cwd ,是的,我认为lstat 可能是更好的选择,因为它不遵循符号链接。取决于想要什么...
  • 我正在使用它来测试“D:\path\subpath”并且我已经创建了目录。它告诉我目录确实 not 存在。 :/ (使用 Windows/MinGW)
【解决方案5】:

如果有的话,我会使用stat()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-14
    • 2013-05-19
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多