また戻ってC++17
今回はC++17で追加されたライブラリについて
filesystem
OSのファイルシステムを操作するAPIを提供。
今までも当然できないこともなかったけど非常に面倒だった。
ファイルのコピーとかでもコピー元をオープンして、コピー先もオープンしてバッファをその先に入れて..とか
ですがC++17では
1 |
fs::copy("src.txt", "dst.txt"); |
この一行でファイルコピーができる。
ちなみにこの場合コピー先にファイルがある場合はエラーとなる。
ではファイルがあっても上書きしたい場合は
1 |
fs::copy("src.txt", "dst.txt", fs::copy_options::overwrite_existing); |
こんな感じ。
さらにすでに存在しているファイルがコピー元よりも古ければ上書きする、なんてのもできる。
1 |
fs::copy("src.txt", "dst.txt", fs::copy_options::update_existing); |
そもそもファイルのコピーなので
fs::copy_file というファイルコピーするそのものがあるのでそれを利用すればいいが。
じゃあcopyとcopy_fileの違いはなにかというとcopyのほうがディレクトリ・シンボリックリンクもコピーできる。
・パスを指定してファイル/ディレクトリの存在確認
1 |
fs::exists("src.txt") |
さらに取得済みのファイル状態を使用して、ファイルの存在確認もできる
・ファイルの状態を取得
fs::statusで状態を取得できます。取得できるのは以下のような感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
namespace std::filesystem { enum class file_type { none, // ファイル種別を判定できなかったか、判定を試みてエラーが発生した not_found, // ファイルが見つからなかったことを表す擬似的な種別 regular, // 通常のファイル directory, // ディレクトリ・ファイル symlink, // シンボリックリンク・ファイル block, // ブロック・スペシャル・ファイル。ブロックデバイスとも呼ばれる character, // キャラクタ・スペシャル・ファイル。キャラクタデバイスとも呼ばれる fifo, // FIFOファイルもしくはパイプファイル socket, // ソケットファイル implementation-defined, // OSのファイルシステムがサポートする実装定義のファイル種別 unknown // ファイルは存在するが種別を決定できなかった }; } |
・ファイル・ディレクトリ削除
1 |
fs::remove("src.txt"); |
ディレクトリを削除する場合、そのディレクトリは空でなければならない。
じゃあ、一気にディレクトリを消したい場合どうすんの、というときは
fs::remove_allで再帰的に削除できる。remove_allは削除されたファイルの数が返りもし存在しないパスを存在した場合は0が返る。
・ファイル権限追加
1 |
fs::permissions("src.txt", fs::perms::owner_all); |
fs::perms::owner_allは0x700なので所有者による読み取り、書き込み、実行および検索の許可
・ファイルサイズ取得
1 |
fs::file_size("regular.txt"); |
・ファイル・ディレクトリを名称変更
1 |
fs::rename("src.txt", "dst.txt"); |
名称変更であるが実際は移動でもあるのでファイル・ディレクトリの移動としても使える。
・ディスク容量を表す
1 |
fs::space_info info = fs::space("/"); |
fs::sapceが指定されたパスの容量を取得。space_infoがディスク容量を表すクラスでcapacity(全体の容量)、free(空き容量)、available(使用できる容量)
となります。(単位はいずれもバイト)
と、いろいろとファイル関連に関してかなり便利になっている。
まあboostで既に実装されているまんまだがこれ以外もいっぱいboostから取り込んでいるので今更だが。
気が付いたらファイルシステム関連しか見てこなかったので次はアルゴリズムでも。
過去分
C++17を知るその1
C++17を知るその2
C++17を知るその3
C++17を知るその4
C++17を知るその5