18
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C++17のFilesystemを使ってみた

Last updated at Posted at 2018-12-11

概要

カレントディレクトリのファイル一覧とかを超簡単に取得できる。
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を使う方法

18
14
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?