是否有办法在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上errno
设置为EINVAL
,在Ubuntu上设置为ENOTDIR
。
POSIXopen()
文档说明了O_CREAT
:
如果文件存在,这个标志没有作用,除了下面
O_EXCL
的说明。否则,如果没有设置O_DIRECTORY
…
好吧,它不是一个文件,并且O_DIRECTORY
是设置的。
(灵感来自问题竞态状态stat和mkdir-在POSIX中似乎没有任何方法可以自动创建一个不存在的目录。)
为了回答标题中的问题,mkdir会这样做——不需要额外的标志,因为mkdir总是"自动地";当且仅当目录不存在(且路径不是文件)时创建该目录。
从注释来看,似乎您实际上想要自动创建并打开目录,但这似乎是XY问题。为什么,因为你不能在任何情况下打开一个目录写?如果您先创建然后打开目录(非原子),那么在行为上没有区别(也没有竞争条件),就好像在过渡期间,有人删除了目录,打开将失败。
如果你担心只在目录中创建具有权限设置的文件,这样就没有人(其他人)可以读取它们,你可以在打开目录后检查目录的权限和所有权(使用fstat)。