为什么我需要stat来检查目录是否已经存在?

时间:2012-11-17 23:16:11

标签: c mkdir

从我的作业:

  

备份文件存储在名为.mybackup的隐藏目录中   如有必要,您的程序会创建。要创建目录,请使用   mkdir()函数(单击此处了解详细信息),但请务必检查   目录是否已存在(使用stat()或检查   EEXIST)。如果目录已存在,请勿覆盖它。

我认为如果目录已存在,mkdir本身会返回-1。我肯定在某个地方看过。我错了吗?

2 个答案:

答案 0 :(得分:4)

对于任何错误,

mkdir都会返回-1。因此,要区分错误,即发现目录是否已存在,您应该使用stat函数,或在errno返回-1后检查EEXIST mkdir

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

答案 1 :(得分:2)

mkdir函数可能由于多种原因而失败:

  

[EACCES]   对路径前缀的组件拒绝搜索权限,或者在要创建的目录的父目录上拒绝写入权限。

     

[EEXIST]   命名文件存在。

     

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

     

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

     

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

     

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

     

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

     

[ENOTDIR]   路径前缀的组件不是目录。

     

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

     

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

     

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

如果函数返回-1,则无法在不检查errno的情况下确定哪个特定错误,这就是建议的原因。