C++17を知るその6~教育委員会~

また戻ってC++17

今回はC++17で追加されたライブラリについて

filesystem

OSのファイルシステムを操作するAPIを提供。
今までも当然できないこともなかったけど非常に面倒だった。

ファイルのコピーとかでもコピー元をオープンして、コピー先もオープンしてバッファをその先に入れて..とか
ですがC++17では

この一行でファイルコピーができる。
ちなみにこの場合コピー先にファイルがある場合はエラーとなる。

ではファイルがあっても上書きしたい場合は

こんな感じ。
さらにすでに存在しているファイルがコピー元よりも古ければ上書きする、なんてのもできる。

そもそもファイルのコピーなので
fs::copy_file というファイルコピーするそのものがあるのでそれを利用すればいいが。
じゃあcopyとcopy_fileの違いはなにかというとcopyのほうがディレクトリ・シンボリックリンクもコピーできる。

・パスを指定してファイル/ディレクトリの存在確認

さらに取得済みのファイル状態を使用して、ファイルの存在確認もできる

・ファイルの状態を取得
fs::statusで状態を取得できます。取得できるのは以下のような感じ。

・ファイル・ディレクトリ削除

ディレクトリを削除する場合、そのディレクトリは空でなければならない。

じゃあ、一気にディレクトリを消したい場合どうすんの、というときは
fs::remove_allで再帰的に削除できる。remove_allは削除されたファイルの数が返りもし存在しないパスを存在した場合は0が返る。

・ファイル権限追加

fs::perms::owner_allは0x700なので所有者による読み取り、書き込み、実行および検索の許可

・ファイルサイズ取得

・ファイル・ディレクトリを名称変更

名称変更であるが実際は移動でもあるのでファイル・ディレクトリの移動としても使える。

・ディスク容量を表す

fs::sapceが指定されたパスの容量を取得。space_infoがディスク容量を表すクラスでcapacity(全体の容量)、free(空き容量)、available(使用できる容量)
となります。(単位はいずれもバイト)

と、いろいろとファイル関連に関してかなり便利になっている。
まあboostで既に実装されているまんまだがこれ以外もいっぱいboostから取り込んでいるので今更だが。

気が付いたらファイルシステム関連しか見てこなかったので次はアルゴリズムでも。

過去分
C++17を知るその1
C++17を知るその2
C++17を知るその3
C++17を知るその4
C++17を知るその5

About the author

naito06

C++やったり、PythonやったりPHPだったり。

Add Comment

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

By naito06

最近の投稿

アーカイブ

カテゴリー

タグクラウド

コーポレートサイト