概要
カレントディレクトリのファイル一覧とかを超簡単に取得できる。
C言語でフォルダ内のファイル数とファイル名を取得 で苦しんだのはなんだったんだ...
std::filesystem
にある。VC++だとstd::experimental::filesystem
。
Visual Studioをアップデートしたらstd::filesystem
で使えました。(追記:2018/12/13)
コンパイル
環境
- gcc : 8.2.1
- VC++ : 19.12.25834 (Visual Studio 2017)
gcc
-lstdc++fs
オプションを付けないといけない。
例:gcc -o test test.cpp -std=c++1z -lstdc++ -lstdc++fs
VC++
/std:c++17
を有効にしなくてok。(exprimentalだからかな)
例:cl test.cpp
std::c++17
を指定してコンパイルする。
例:cl test.cpp /std::c++17
(追記:2018/12/13)
カレントディレクトリのファイル一覧を取得する
cpprefjpを参考にした。
filename()までだと、出力がダブルコーテーションで括られる。
for(const std::filesystem::directory_entry &i:std::filesystem::directory_iterator(".")){
std::cout << i.path().filename().string() << std::endl;
}
指定ディレクトリ以下のファイルを再帰的に表示
コマンドライン引数で指定したディレクトリ以下のファイルを再帰的にいい感じに表示。
#include<filesystem>
#include<iostream>
void printFile(std::string path,int depth = 0){
for(const std::filesystem::directory_entry &i:std::filesystem::directory_iterator(path)){
for(int i=0;i<depth;++i){
if(i==depth-1){
printf(" ├");
}else{
printf(" │");
}
}
if(i.is_directory()){
std::cout << i.path().filename().string() << std::endl;
printFile(i.path().string(),depth+1);
}else{
std::cout << i.path().filename().string() << std::endl;
}
}
}
int main(int argc,char *argv[]){
printFile(argv[1]);
return 0;
}
実行結果
a.png
file2
file1
folder2
├test.png
folder1
├file3
├file4
├folder3
│ ├file7
│ ├file5
│ ├file6
追記(2018/12/12)
再帰的にファイルを表示するだけならrecursive_directory_iterator
を使えばいいっぽい。(名前の通りだね)
指定ディレクトリ以下のファイル,フォルダを再帰的にすべて表示
#include<filesystem>
#include<iostream>
int main(int argc,char *argv[]){
for(const std::filesystem::directory_entry &i:std::filesystem::recursive_directory_iterator(argv[1])){
std::cout << i.path().filename().string() << std::endl;
}
return 0;
}
実行結果
a.png
file2
file1
folder2
test.png
folder1
file3
file4
folder3
file7
file5
file6
参考
cpprefjp - filesystem
cpprefjp - 処理系
本の虫 - GCCの実験的なfilesystemを使う方法