C/C++でディレクトリ内のファイル一覧を取得する方法を解説
標準C++の制限とsystem関数を使う方法
標準C++には、ディレクトリ内のファイル一覧を取得するための標準的な機能は用意されていません。しかし、system関数を使ってOSのシェルコマンドを呼び出すことで、簡易的に実現できます。以下は、Linux環境でls -lコマンドを実行する例です。
コード例
#include<iostream>
int main () {
char command[50] = "ls -l";
system(command);
return 0;
}出力結果
-rwxrwxrwx 1 root root 9728 Feb 25 20:51 a.out -rwxrwxrwx 1 root root 131 Feb 25 20:44 hello.cpp -rwxrwxrwx 1 root root 243 Sep 7 13:09 hello.py -rwxrwxrwx 1 root root 33198 Jan 7 11:42 hello.o drwxrwxrwx 0 root root 512 Oct 1 21:40 hydeout -rwxrwxrwx 1 root root 42 Oct 21 11:29 my_file.txt -rwxrwxrwx 1 root root 527 Oct 21 11:29 watch.py
Windows環境で実行する場合は、lsの代わりにdirコマンドを使用することで、同じようにファイル一覧を表示できます。
なお、system関数を使う方法は手軽な反面、コマンドの出力をプログラム内で加工できないという欠点があります。実用的なアプリケーションでは、次に紹介するdirentライブラリの利用を検討しましょう。
direntライブラリを使った柔軟な方法
より柔軟で移植性の高いAPIを使いたい場合は、direntライブラリを利用するのがおすすめです。このライブラリを使うと、ファイル名を文字列として直接取得できるため、条件による絞り込みや加工が自由に行えます。
コード例
#include <iostream>
#include <dirent.h>
#include <sys/types.h>
using namespace std;
void list_dir(const char *path) {
struct dirent *entry;
DIR *dir = opendir(path);
if (dir == NULL) {
return;
}
while ((entry = readdir(dir)) != NULL) {
cout << entry->d_name << endl;
}
closedir(dir);
}
int main() {
list_dir("/home/username/Documents");
}出力結果
a.out hello.cpp hello.py hello.o hydeout my_file.txt watch.py
このコードでは、opendir関数でディレクトリを開き、readdir関数でエントリを1件ずつ読み出しています。処理が完了したらclosedir関数でディレクトリを閉じるのを忘れないようにしましょう。
まとめ
C/C++でディレクトリ内のファイル一覧を取得するには、手軽なsystem関数を使う方法と、direntライブラリを使う方法があります。出力結果をプログラム内で活用したい場合は、direntライブラリを使った方法が適しています。また、C++17以降では標準ライブラリのstd::filesystemを使うことで、追加のライブラリなしに同様の処理が実現できる点も覚えておくと便利です。
-
C++とOpenCVで特定のピクセルの値を取得する2つの方法を解説
OpenCVで画像内の特定のピクセルの値を読み取るには、「at」メソッドを使う方法と、Mat_クラスによる「直接アクセス」を使う方法の2通りがあります。本記事では、両方のアプローチをサンプルコードとともにわかりやすく解説します。 「at」メソッドでピクセル値を取得する まずは「at」メソッドから見ていきましょう。次のプログラムは、カラー画像の座標 (10, 29) にあるピクセルの値を読み出す例です。 サンプルコード #include<iostream> #include<opencv2/highgui/highgui.hpp> using namespace std;
-
Javaでディレクトリ内のjpgファイル一覧を取得する方法
FilenameFilterインターフェースを使った方法Fileクラスのlist(FilenameFilter filter)メソッドは、現在のFileオブジェクトが表すパスに存在するすべてのファイルおよびディレクトリの名前をString配列として返します。ただし、返される配列には、指定したフィルター条件を満たすファイル名のみが含まれます。FilenameFilterは、次の単一のメソッドを持つJavaのインターフェースです。accept(File dir, String name)拡張子に基づいてファイル名を取得したい場合は、このインターフェースを実装したクラスを作成し、そのインスタンスをF