我需要使用C程序将二进制文件写入某个指定的目录。但是,在写作时我想确保如果目录结构不存在,它应该为我创建一个。
我怎样才能做到这一点?
答案 0 :(得分:2)
您必须使用stat()
检查叶子目录是否存在,并使用mkdir()
以自上而下的方式迭代创建目录。或者您甚至可以放弃检查并从创建目录开始 - 如果您的目录已经存在,它将失败并出现大量EEXIST
错误。这只是简单方法。
如果您担心正确性,那么有更好的方式。您应该在所需路径的后续可用组件(目录)上使用openat()
,并mkdirat()
创建缺少的路径。这样你可以避免可能的比赛。最后,您还应使用openat()
打开文件。
检查相关的manpages,了解如何使用上述系统调用。
如果上面的杆不够长,那么下面就可以找到我简单的Linux风味的鱼。 xopen()
函数允许您在给定路径中打开文件,沿途创建目录。
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
/* Look out! It modifies pathname! */
int xopen(char *pathname, int flags, mode_t mode, mode_t dirmode)
{
int fd, errsv;
int dirfd = AT_FDCWD;
char *ptr = pathname;
while (*ptr == '/')
ptr++;
for (;;) {
strsep(&ptr, "/");
if (ptr == NULL) {
fd = openat(dirfd, pathname, flags, mode);
break;
}
while (*ptr == '/')
ptr++;
if (*ptr == '\0') {
errno = EISDIR;
fd = -1;
break;
}
if ((fd = mkdirat(dirfd, pathname, dirmode)) < 0 && errno != EEXIST)
break;
if ((fd = openat(dirfd, pathname, O_DIRECTORY)) < 0)
break;
if (dirfd != AT_FDCWD)
close(dirfd);
dirfd = fd;
pathname = ptr;
}
errsv = errno;
if (dirfd != AT_FDCWD)
close(dirfd);
errno = errsv;
return fd;
}