如何读取/写入C中的目录文件?

时间:2012-06-21 22:37:52

标签: c file-io

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

我怎样才能做到这一点?

1 个答案:

答案 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;
}