[C言語] ディレクトリ内のファイルの名前を取得する方法
C言語でディレクトリ内のファイル名を取得するには、POSIX標準のライブラリを使用します。
具体的には、dirent.h
ヘッダーファイルをインクルードし、opendir
関数でディレクトリを開きます。
その後、readdir
関数を用いてstruct dirent
を取得し、d_name
メンバーを参照することでファイル名を取得できます。
ディレクトリの操作が終わったら、closedir
関数でディレクトリを閉じることを忘れないようにしましょう。
この方法はUnix系システムで一般的に使用されます。
- opendir、readdir、closedir関数を使用したファイル名の取得方法
- dirent構造体の理解と活用
- ファイル名のソートや特定の拡張子のファイルをリストアップする方法
- 再帰的にサブディレクトリを探索する方法
- Windows環境での対応方法とC言語の利点
ディレクトリ内のファイル名を取得する方法
ディレクトリ内のファイル名を取得することは、ファイル操作を行う上で基本的な技術です。
C言語では、標準ライブラリを使用してディレクトリを操作し、ファイル名を取得することができます。
以下では、具体的な関数と構造体を用いてその方法を解説します。
opendir関数とreaddir関数の使用
opendir関数
とreaddir関数
は、ディレクトリを開いてその中のファイル名を取得するために使用されます。
- opendir関数
opendir関数
は、指定したディレクトリを開き、ディレクトリストリームへのポインタを返します。
ディレクトリが存在しない場合や開けない場合は、NULL
を返します。
- readdir関数
readdir関数
は、opendir
で開いたディレクトリストリームから次のディレクトリエントリを読み込みます。
読み込んだエントリはdirent
構造体として返されます。
以下に、opendir
とreaddir
を使用したサンプルコードを示します。
#include <stdio.h>
#include <dirent.h>
int main() {
// ディレクトリを開く
DIR *dir = opendir(".");
if (dir == NULL) {
perror("opendir");
return 1;
}
// ディレクトリ内のファイル名を取得
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("ファイル名: %s\n", entry->d_name);
}
// ディレクトリを閉じる
closedir(dir);
return 0;
}
ファイル名: .
ファイル名: ..
ファイル名: file1.txt
ファイル名: file2.c
このプログラムは、カレントディレクトリ内のすべてのファイル名を表示します。
opendir
でディレクトリを開き、readdir
で各ファイル名を取得して表示しています。
dirent構造体の理解
dirent
構造体は、readdir関数
によって返されるディレクトリエントリを表します。
この構造体には、ファイル名やファイルの種類に関する情報が含まれています。
- 主要なメンバー
d_name
: ファイル名を格納する文字列d_type
: ファイルの種類を示す(通常は使用しない)
d_name
は、ファイル名を取得するために最もよく使用されるメンバーです。
d_type
は、ファイルが通常のファイルかディレクトリかを判別するために使用されることがありますが、プラットフォームによってはサポートされていない場合があります。
closedir関数でのディレクトリのクローズ
closedir関数
は、opendir
で開いたディレクトリストリームを閉じるために使用されます。
ディレクトリを操作し終わったら、必ずclosedir
を呼び出してリソースを解放することが重要です。
- 使用方法
closedir(DIR *dirp);
dirp
は、opendir
で取得したディレクトリストリームへのポインタです。
closedir
を呼び出さないと、リソースリークが発生する可能性があります。
これは、特に長時間実行されるプログラムや多くのディレクトリを操作するプログラムにおいて問題となります。
応用例
ディレクトリ内のファイル名を取得する基本的な方法を理解したところで、さらに応用的な操作を行う方法を紹介します。
これらの応用例は、実際のプログラム開発において非常に役立ちます。
ファイル名のソート
取得したファイル名をソートすることで、アルファベット順やサイズ順にファイルを整理することができます。
C言語では、標準ライブラリのqsort関数
を使用してファイル名をソートすることが可能です。
以下に、ファイル名をアルファベット順にソートするサンプルコードを示します。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
int compare(const void *a, const void *b) {
return strcmp(*(const char **)a, *(const char **)b);
}
int main() {
DIR *dir = opendir(".");
if (dir == NULL) {
perror("opendir");
return 1;
}
struct dirent *entry;
char *filenames[100];
int count = 0;
while ((entry = readdir(dir)) != NULL) {
filenames[count++] = strdup(entry->d_name);
}
closedir(dir);
qsort(filenames, count, sizeof(char *), compare);
for (int i = 0; i < count; i++) {
printf("ファイル名: %s\n", filenames[i]);
free(filenames[i]);
}
return 0;
}
このプログラムは、カレントディレクトリ内のファイル名を取得し、qsort
を使用してアルファベット順にソートして表示します。
特定の拡張子のファイルをリストアップ
特定の拡張子を持つファイルのみをリストアップすることは、ファイル操作の効率を高めるために有用です。
以下のサンプルコードでは、.txt
拡張子を持つファイルのみをリストアップします。
#include <stdio.h>
#include <string.h>
#include <dirent.h>
int main() {
DIR *dir = opendir(".");
if (dir == NULL) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (strstr(entry->d_name, ".txt") != NULL) {
printf("テキストファイル: %s\n", entry->d_name);
}
}
closedir(dir);
return 0;
}
このプログラムは、カレントディレクトリ内の.txt
ファイルのみを表示します。
strstr関数
を使用して、ファイル名に特定の拡張子が含まれているかを確認しています。
再帰的にサブディレクトリを探索
ディレクトリ内のファイルを再帰的に探索することで、サブディレクトリ内のファイルも含めてリストアップすることができます。
以下のサンプルコードでは、再帰的にディレクトリを探索してすべてのファイルを表示します。
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
void listFiles(const char *path) {
DIR *dir = opendir(path);
if (dir == NULL) {
perror("opendir");
return;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
char fullPath[1024];
snprintf(fullPath, sizeof(fullPath), "%s/%s", path, entry->d_name);
struct stat statbuf;
if (stat(fullPath, &statbuf) == 0 && S_ISDIR(statbuf.st_mode)) {
listFiles(fullPath);
} else {
printf("ファイル: %s\n", fullPath);
}
}
closedir(dir);
}
int main() {
listFiles(".");
return 0;
}
ファイル: ./.vscode/c_cpp_properties.json
ファイル: ./.vscode/settings.json
ファイル: ./.vscode/tasks.json
ファイル: ./main.c
ファイル: ./main.exe
ファイル: ./sample.csv
ファイル: ./tempCodeRunnerFile.c
このプログラムは、指定されたディレクトリから開始して、すべてのサブディレクトリを再帰的に探索し、ファイル名を表示します。
stat関数
を使用して、エントリがディレクトリかどうかを判定しています。
よくある質問
まとめ
ディレクトリ内のファイル名を取得する方法は、C言語の基本的なファイル操作の一部です。
この記事では、opendir
、readdir
、closedir関数
を使用したファイル名の取得方法と、その応用例について解説しました。
これらの知識を活用して、より効率的なファイル操作を行いましょう。