[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環境でのディレクトリ作成方法、エラーハンドリング、再帰的なディレクトリ作成、権限の指定など、さまざまな技術を学びました。
これらの知識を活用して、より効率的で安全なプログラムを作成してみてください。