【问题标题】:Why would I need stat to check if a directory already exists?为什么我需要 stat 来检查目录是否已经存在?
【发布时间】:2012-11-17 23:16:10
【问题描述】:

我的作业:

备份文件存储在名为 .mybackup 的隐藏目录中,该目录 如有必要,您的程序会创建。要创建目录,请使用 mkdir() 函数(点击这里查看详细信息),但一定要检查 目录是否已经存在(使用 stat() 或检查 存在)。如果该目录已经存在,请不要覆盖它。

如果目录已经存在,我认为 mkdir 固有地返回 -1。我肯定在某个地方读到过。我是不是搞错了?

【问题讨论】:

  • 我建议也检查this discussion:它不是重复的,但非常接近。 )

标签: c mkdir


【解决方案1】:

mkdir 对任何错误返回 -1。所以为了区分错误,即发现目录是否已经存在,你应该使用stat函数或者在mkdir返回-1之后检查errno for EEXIST

if(mkdir(".mybackup", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1)
{
    if(errno == EEXIST)
    {
        // Directory already exists, do something
    }
}

【讨论】:

  • 哦,很好的例子。非常感谢。
  • 请注意,您需要包含 (用于 mkdir)和 (用于处理 errnoEEXIST)。
【解决方案2】:

mkdir 函数失败的原因有很多:

[EACCES] 路径前缀的某个组件被拒绝搜索权限,或者要创建的目录的父目录被拒绝写权限。

[存在] 指定的文件存在。

[循环] 在解析路径参数期间遇到的符号链接中存在循环。

[EMLINK] 父目录的链接数将超过 {LINK_MAX}。

[ENAMETOOLONG] 路径参数的长度超过 {PATH_MAX} 或路径名组件长于 {NAME_MAX}。

[ENOENT] path 指定的路径前缀的组件未命名现有目录或路径为空字符串。

[ENOSPC] 文件系统没有足够的空间来保存新目录的内容或扩展新目录的父目录。

[ENOTDIR] 路径前缀的组成部分不是目录。

[EROFS] 父目录驻留在只读文件系统上。 如果出现以下情况,mkdir() 函数可能会失败:

[循环] 在解析路径参数期间遇到了超过 {SYMLOOP_MAX} 个符号链接。

[ENAMETOOLONG] 由于在解析路径参数时遇到符号链接,替换的路径名字符串的长度超过了 {PATH_MAX}。

如果函数返回-1,如果不检查errno,您将无法确定是哪个具体错误,这就是建议的原因。

【讨论】:

  • EMLINK +1,普通用户不太可能在任何现代文件系统上达到此限制,但这些确实发生在现场!
猜你喜欢
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 2013-10-01
相关资源
最近更新 更多