std::experimental::filesystem::rename
From cppreference.com
< cpp | experimental | fs
| ヘッダー <experimental/filesystem> で定義されています |
||
| void rename( const path& old_p, const path& new_p ); void rename( const path& old_p, const path& new_p, std::error_code& ec ); |
(filesystem TS) | |
old_pで識別されるファイルシステムオブジェクトを、POSIXのrename関数と同様に、new_pに移動または名前変更します。
- もしold_pが非ディレクトリファイルの場合、new_pは以下のいずれかである必要があります。
- old_pと同じファイル、またはそれにハードリンクされている場合:この場合、何も行われません。
- 既存の非ディレクトリファイルの場合:new_pは最初に削除され、その後、他のプロセスがnew_pを削除されたと認識できないように、new_pというパス名がファイルにリンクされ、old_pはファイルからアンリンクされます。old_pを含むディレクトリとnew_pを含むディレクトリの両方に対して書き込み権限が必要です。
- 既存のディレクトリ内の存在しないファイルの場合:new_pというパス名がファイルにリンクされ、old_pはファイルからアンリンクされます。old_pを含むディレクトリとnew_pを含むディレクトリの両方に対して書き込み権限が必要です。
- もしold_pがディレクトリの場合、new_pは以下のいずれかである必要があります。
- old_pと同じディレクトリ、またはそれにハードリンクされている場合:この場合、何も行われません。
- 既存のディレクトリの場合:POSIXシステムではnew_pが空であれば削除されますが、他のシステムではエラーとなる場合があります。エラーでない場合、new_pは最初に削除され、その後、他のプロセスがnew_pを削除されたと認識できないように、new_pというパス名がディレクトリにリンクされ、old_pはディレクトリからアンリンクされます。old_pを含むディレクトリとnew_pを含むディレクトリの両方に対して書き込み権限が必要です。
- 存在しないディレクトリで、ディレクトリ区切り文字で終わらず、その親ディレクトリが存在する場合:new_pというパス名がディレクトリにリンクされ、old_pはディレクトリからアンリンクされます。old_pを含むディレクトリとnew_pを含むディレクトリの両方に対して書き込み権限が必要です。
- シンボリックリンクはたどられません:old_pがシンボリックリンクの場合、そのターゲットではなく、リンク自体が名前変更されます。new_pが既存のシンボリックリンクの場合、そのターゲットではなく、リンク自体が削除されます。
以下の場合、renameは失敗します。
- new_pがドットまたはドットドットで終わる場合。
- ディレクトリ区切り文字で終わる存在しないディレクトリをnew_pが指定する場合。
- old_pがnew_pの祖先であるディレクトリの場合。
目次 |
[編集] パラメータ
| old_p | - | 移動または名前変更するパス |
| new_p | - | 移動/名前変更操作のターゲットパス |
| エラーコード | - | 例外を投げないオーバーロードでのエラー報告のための出力パラメータ |
[編集] 戻り値
(なし)
[編集] 例外
error_code&パラメータを取らないオーバーロードは、基盤となるOS APIエラーが発生した場合にfilesystem_errorをスローします。これは、最初の引数としてold_p、2番目の引数としてnew_p、エラーコード引数としてOSエラーコードを構築して渡します。std::bad_allocは、メモリ割り当てに失敗した場合にスローされる可能性があります。 error_code&パラメータを取るオーバーロードは、OS API呼び出しが失敗した場合にそれをOS APIエラーコードに設定し、エラーが発生しなかった場合はec.clear()を実行します。このオーバーロードはnoexcept 指定:
noexcept
[編集] 例
このコードを実行
#include <experimental/filesystem> #include <fstream> #include <iostream> namespace fs = std::experimental::filesystem; int main() { fs::path p = fs::current_path() / "sandbox"; fs::create_directories(p/"from"); std::ofstream(p/"from/file1.txt").put('a'); fs::create_directory(p/"to"); // fs::rename(p/"from/file1.txt", p/"to/"); // error: to is a directory fs::rename(p/"from/file1.txt", p/"to/file2.txt"); // OK // fs::rename(p/"from", p/"to"); // error: to is not empty fs::rename(p/"from", p/"to/subdir"); // OK fs::remove_all(p); }
[編集] 関連項目
| ファイル名を変更する (関数) | |
| ファイルまたは空のディレクトリを削除する ファイルまたはディレクトリとその内容をすべて再帰的に削除する (関数) |