この記事では、C言語を使用してディレクトリ内のファイル名を取得する方法や、サブディレクトリ内のファイルも含めて取得する方法、さらにはファイル名のフィルタリングやソートの方法について解説します。
ファイル名を取得するための基本的な方法
C言語でディレクトリ内のファイル名を取得するのは、opendir関数
とreaddir関数
を使用するのが一番シンプルでカンタンです。
まず、opendir関数
を使用してディレクトリを開きます。
この関数は、指定されたディレクトリのストリームを返します。
#include <stdio.h>
#include <dirent.h>
int main() {
DIR *dir;
struct dirent *entry;
dir = opendir("ディレクトリのパス");
if (dir == NULL) {
perror("ディレクトリを開けませんでした");
return 1;
}
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
上記のコードでは、opendir関数
で指定したディレクトリのストリームをDIR型
の変数dir
に格納しています。
そして、readdir関数
を使用してディレクトリ内のエントリを一つずつ取得し、d_name
メンバを使用してファイル名を表示しています。
サブディレクトリ内のファイルも含めて取得する方法
C言語を使用して、特定のディレクトリ内のファイル名を取得する方法は簡単ですが、サブディレクトリ内のファイルも含めて取得する場合は少し複雑になります。
以下に、サブディレクトリ内のファイルも含めて取得する方法を説明します。
#include <stdio.h>
#include <dirent.h>
#include <string.h>
void listFilesRecursively(char *path) {
DIR *dir;
struct dirent *entry;
// ディレクトリを開く
dir = opendir(path);
if (dir == NULL) {
printf("ディレクトリを開けませんでした。\n");
return;
}
// ディレクトリ内のファイルを読み込む
while ((entry = readdir(dir)) != NULL) {
// "." と ".." は無視する
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
// ファイルのパスを作成する
char filePath[256];
snprintf(filePath, sizeof(filePath), "%s/%s", path, entry->d_name);
// ファイルかディレクトリかを判定する
if (entry->d_type == DT_DIR) {
// サブディレクトリの場合は再帰的に処理する
listFilesRecursively(filePath);
} else {
// ファイルの場合はファイル名を表示する
printf("%s/%s\n", path,entry->d_name);
}
}
// ディレクトリを閉じる
closedir(dir);
}
int main() {
char path[256] = "..";
listFilesRecursively(path);
return 0;
}
上記のコードでは、listFilesRecursively()関数
を定義しています。
この関数は、引数としてディレクトリのパスを受け取り、そのディレクトリ内のファイルを再帰的に取得して表示します。
main()関数
では、取得したいディレクトリのパスを指定してlistFilesRecursively()関数
を呼び出しています。
ディレクトリのパスは、char型
の配列で指定します。
このサンプルコードを実行すると、指定したディレクトリとその中のサブディレクトリのファイル名が表示されます。
注意点として、上記のコードではディレクトリ内のファイルのみを取得していますが、ディレクトリ自体も取得したい場合は、entry->d_type
の値がDT_DIR
かどうかを判定することで実現できます。
以上が、サブディレクトリ内のファイルも含めて取得する方法の説明です。
この方法を使えば、任意のディレクトリ内のファイルを再帰的に取得することができます。