ファイル

[C言語] ディレクトリ(フォルダ)を新しく作成する方法

C言語で新しいディレクトリを作成するには、標準ライブラリの関数を使用します。

具体的には、mkdir関数を用います。

この関数は、指定したパスに新しいディレクトリを作成します。

使用する際には、#include <sys/stat.h>#include <direct.h>をインクルードする必要があります。

また、mkdir関数は、作成に成功すると0を返し、失敗すると-1を返します。

エラーの詳細を知るには、errnoを確認します。

この方法は、POSIX準拠のシステムやWindowsで使用可能です。

C言語でディレクトリを作成する方法

C言語でディレクトリを作成する方法について解説します。

POSIX標準のmkdir関数やWindows環境での方法を中心に、基本的な使い方からエラーハンドリングまでを詳しく説明します。

POSIX標準のmkdir関数

mkdir関数の基本的な使い方

mkdir関数は、POSIX標準で提供されているディレクトリ作成用の関数です。

以下に基本的な使い方を示します。

#include <sys/stat.h>
#include <sys/types.h>
int main() {
    // ディレクトリ名とパーミッションを指定してディレクトリを作成
    if (mkdir("new_directory", 0755) == 0) {
        printf("ディレクトリが作成されました。\n");
    } else {
        perror("ディレクトリの作成に失敗しました");
    }
    return 0;
}

このコードは、new_directoryという名前のディレクトリを作成し、パーミッションを0755に設定します。

mkdir関数の引数と戻り値

mkdir関数は以下の引数を取ります。

引数名説明
pathname作成するディレクトリのパス
modeディレクトリのパーミッション

戻り値は、成功した場合は0、失敗した場合は-1を返します。

失敗した場合、errnoにエラーコードが設定されます。

エラーハンドリングの方法

mkdir関数のエラーハンドリングは、perror関数を使用して行います。

perrorは、errnoに基づいてエラーメッセージを表示します。

例:perror("エラーメッセージ")

Windows環境でのディレクトリ作成

_mkdir関数の使用方法

Windows環境では、_mkdir関数を使用してディレクトリを作成します。

以下に基本的な使い方を示します。

#include <direct.h>
int main() {
    // ディレクトリ名を指定してディレクトリを作成
    if (_mkdir("new_directory") == 0) {
        printf("ディレクトリが作成されました。\n");
    } else {
        perror("ディレクトリの作成に失敗しました");
    }
    return 0;
}

このコードは、new_directoryという名前のディレクトリを作成します。

Windows APIを利用したディレクトリ作成

Windows APIを利用してディレクトリを作成することも可能です。

CreateDirectory関数を使用します。

#include <windows.h>
int main() {
    // ディレクトリ名を指定してディレクトリを作成
    if (CreateDirectory("new_directory", NULL)) {
        printf("ディレクトリが作成されました。\n");
    } else {
        printf("ディレクトリの作成に失敗しました。エラーコード: %lu\n", GetLastError());
    }
    return 0;
}

このコードは、new_directoryという名前のディレクトリを作成し、エラーが発生した場合はエラーコードを表示します。

エラーハンドリングの方法

Windows APIを使用する場合、GetLastError関数を用いてエラーコードを取得し、エラーメッセージを表示します。

例:printf("エラーコード: %lu\n", GetLastError())

ディレクトリ作成の応用例

ディレクトリ作成の基本を理解したら、次は応用例を見ていきましょう。

ここでは、再帰的にディレクトリを作成する方法や、ディレクトリの存在を確認してから作成する方法、権限を指定してディレクトリを作成する方法について解説します。

再帰的にディレクトリを作成する

再帰的にディレクトリを作成する場合、親ディレクトリが存在しない場合でも、必要なすべてのディレクトリを一度に作成することができます。

以下は、再帰的にディレクトリを作成するサンプルコードです。

#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
int makeDirectories(const char *path) {
    char tempPath[256];
    char *p = NULL;
    size_t len;
    // パスをコピー
    snprintf(tempPath, sizeof(tempPath), "%s", path);
    len = strlen(tempPath);
    // パスの最後が'/'でない場合、追加
    if (tempPath[len - 1] == '/') {
        tempPath[len - 1] = 0;
    }
    // 各ディレクトリを作成
    for (p = tempPath + 1; *p; p++) {
        if (*p == '/') {
            *p = 0;
            mkdir(tempPath, S_IRWXU);
            *p = '/';
        }
    }
    return mkdir(tempPath, S_IRWXU);
}
int main() {
    if (makeDirectories("parent/child/grandchild") == 0) {
        printf("ディレクトリが再帰的に作成されました。\n");
    } else {
        perror("ディレクトリの作成に失敗しました");
    }
    return 0;
}

このコードは、parent/child/grandchildという階層のディレクトリを再帰的に作成します。

ディレクトリの存在を確認してから作成する

ディレクトリを作成する前に、そのディレクトリが既に存在するかどうかを確認することが重要です。

以下のコードは、ディレクトリの存在を確認してから作成する方法を示しています。

#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <errno.h>
int main() {
    struct stat st = {0};
    // ディレクトリが存在するか確認
    if (stat("new_directory", &st) == -1) {
        // 存在しない場合、作成
        if (mkdir("new_directory", 0755) == 0) {
            printf("ディレクトリが作成されました。\n");
        } else {
            perror("ディレクトリの作成に失敗しました");
        }
    } else {
        printf("ディレクトリは既に存在します。\n");
    }
    return 0;
}

このコードは、new_directoryが存在しない場合にのみディレクトリを作成します。

権限を指定してディレクトリを作成する

ディレクトリを作成する際に、特定の権限を指定することができます。

以下のコードは、権限を指定してディレクトリを作成する方法を示しています。

#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
int main() {
    // パーミッションを指定してディレクトリを作成
    if (mkdir("secure_directory", 0700) == 0) {
        printf("ディレクトリが作成されました。パーミッション: 0700\n");
    } else {
        perror("ディレクトリの作成に失敗しました");
    }
    return 0;
}

このコードは、secure_directoryというディレクトリを作成し、パーミッションを0700に設定します。

これにより、所有者のみがアクセス可能なディレクトリが作成されます。

まとめ

C言語でディレクトリを作成する方法について、基本的な関数の使い方から応用例までを解説しました。

POSIX標準のmkdir関数やWindows環境でのディレクトリ作成方法、エラーハンドリング、再帰的なディレクトリ作成、権限の指定など、さまざまな技術を学びました。

これらの知識を活用して、より効率的で安全なプログラムを作成してみてください。

関連記事

Back to top button