2012-11-17 60 views
1

从我的家庭作业:为什么我需要stat来检查一个目录是否已经存在?

备份文件存储在一个名为.mybackup一个隐藏目录,其中 你的程序造成的,如果需要的话。要创建一个目录,使用mkdir()函数(详情请点击这里) ,但一定要检查 目录是否已经存在(使用stat()或检查E-mail为 )。如果该目录已经存在,请不要覆盖它。

我以为如果目录已经存在,mkdir本质上返回-1。我确实在某个地方读过。我错了吗?

+1

我建议检查[此讨论](http://stackoverflow.com/questions/6314042/stat-vs-mkdir-with-eexist):它不是重复的,但非常接近它。 ) – raina77ow

回答

4

mkdir对于任何错误都返回-1。因此,要区分错误,即要发现目录是否已经存在,则应使用stat函数或在mkdir返回-1后检查errnoEEXIST

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

哦,很好的例子。非常感谢。 – Aerovistae

+0

请注意,您需要包含(用于'mkdir')和(用于处理'errno'和'EEXIST')。对于EMLINK, –

2

mkdir功能可能会失败的原因有很多:

[EACCES] 搜索权限被拒绝的路径前缀的一个组成部分,或者拒绝写入权限的目录的父目录被创建。

[EEXIST] 指定的文件存在。

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

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

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

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

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

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

[EROFS] 父目录驻留在只读文件系统上。 的MKDIR()函数可能会失败,如果:

[ELOOP] 比路径参数的分辨率过程中遇到{SYMLOOP_MAX}符号链接更多。

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

如果函数返回-1你不能没有检查errno确保其特定错误的,这就是为什么它被建议。

+0

+1,典型用户不太可能在任何现代文件系统上达到此限制,但这些确实发生在现场! –

相关问题