0

C プログラムを使用して、指定したディレクトリにバイナリ ファイルを書き込む必要があります。しかし、書きながら、ディレクトリ構造が存在しない場合は作成する必要があることを確認したいと思います。

どうすればこれを達成できますか?

4

1 に答える 1

2

を使用してリーフ ディレクトリが存在するかどうかを確認し、 を使用stat()してトップダウン方式でディレクトリを繰り返し作成する必要がありますmkdir()EEXISTまたは、チェックを放棄してディレクトリの作成を開始することもできます。ディレクトリが既に存在する場合、一連のエラーで失敗します。これは簡単な方法です。

正確性が気になる場合は、もっと良い方法があります。必要openat()なパスの後続の利用可能なコンポーネント (ディレクトリ) で使用しmkdirat()、不足しているコンポーネントを作成する必要があります。そうすれば、起こりうるレースを避けることができます。最後に、too を使用してファイルを開く必要があります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 に答える