0

我需要使用 C 程序将二进制文件写入某个指定目录。但是,在编写时,我想确保如果目录结构不存在,它应该为我创建一个。

我怎样才能做到这一点?

4

1 回答 1

2

您必须检查叶子目录是否存在,使用stat(),并以自上而下的方式迭代创建目录,使用mkdir()EEXIST或者您甚至可以放弃检查并从创建目录开始 -如果您的目录已经存在,它将失败并出现一堆错误。这只是一个简单的方法

如果您担心正确性,有更好的方法。您应该openat()在所需路径的后续可用组件(目录)上使用并mkdirat()创建缺少的组件。这样你就可以避免可能的比赛。最后,您也应该使用打开文件openat()

检查相关的联机帮助页,看看你应该如何使用提到的系统调用。


如果上面的鱼竿对你来说不够长,那么你可以在下面找到我简单的 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;
}
于 2012-06-21T23:15:01.860 回答