首页 > 解决方案 > 如果目录不存在,POSIX 系统有没有办法自动创建目录?

问题描述

POSIX系统上是否有任何方法可以仅在目录尚不存在时自动创建目录?

如同

int fd = open( "/path/to/file", O_CREAT | O_EXCL | O_RDWR, 0644 );

这不起作用:

int dfd = open( "/path/to/dir", O_DIRECTORY | O_CREAT | O_EXCL | O_RDWR, 0755 );

在我的 Solaris 11 和 Ubuntu 20.04 系统上失败,在 Solaris 和 Ubuntu 上设置errno为。EINVALENOTDIR

POSIXopen()文档说明了这一点O_CREAT

如果文件存在,则此标志无效,除非O_EXCL如下所述。否则,如果O_DIRECTORY没有设置...

好吧,它不是一个文件,O_DIRECTORY而是设置好的。

(受Race condition stat and mkdir问题的启发- 如果目录尚不存在,POSIX 中似乎没有任何方法可以自动创建目录。)

标签: cposix

解决方案


要回答您标题中的问题,mkdir 会这样做——不需要额外的标志,因为当且仅当它不存在(并且路径不是文件)时,mkdir 将始终“原子地”创建一个目录。

从评论中,您似乎实际上想要原子地创建和打开一个目录,但这似乎是一个 XY 问题。为什么,因为无论如何您都无法打开目录进行写入?如果您首先创建然后打开目录(非原子地),那么行为没有差异(也没有竞争条件),就好像在此期间有人删除了目录,打开将失败。

如果您担心只在设置了权限的目录中创建文件,这样没有人(其他)可以读取它们,您可以在打开目录后检查目录的权限和所有权(使用 fstat)。


推荐阅读