【发布时间】:2021-03-04 21:35:37
【问题描述】:
在 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 系统上失败,errno 在 Solaris 上设置为 EINVAL,在 Ubuntu 上设置为 ENOTDIR。
POSIX open() documentation 为 O_CREAT 声明了这一点:
如果文件存在,则此标志无效,除非在下面的
O_EXCL中注明。否则,如果没有设置O_DIRECTORY...
嗯,它不是一个文件,并且设置了O_DIRECTORY。
(受Race condition stat and mkdir 问题的启发 - 如果目录尚不存在,POSIX 中似乎没有任何方法可以自动创建目录。)
【问题讨论】:
-
类似
mkdir -p "/path/to/dir"? -
为什么不
mkdir()? -
好吧,我很想用“我已阅读整个 POSIX 标准”来写一个“不”的答案,但那将是......夸张;)
-
@BlockofDiamond
mkdir()不保证会同时创建一个新目录和自动打开它。据我所知,在 POSIX 下没有办法做到这一点。我不知道是否需要它类似于导致O_EXCL的安全原因以及在C11 中添加到fopen()的"x"独占模式,但我确实感到惊讶的是没有办法我已经能够找到执行它。 -
@KamilCuk 我怀疑你是对的——但仅仅因为我找不到东西或想出办法来做这件事并不意味着其他人不能。我确实挖掘了一段时间 - 你认为我如何知道尝试产生的
errno值? :-)