std::filesystem::rename
提供: cppreference.com
< cpp | filesystem
<tbody>
</tbody>
| ヘッダ <filesystem> で定義
|
||
void rename(const std::filesystem::path& old_p, const std::filesystem::path& new_p); void rename(const std::filesystem::path& old_p, const std::filesystem::path& new_p, std::error_code& ec) noexcept; |
(C++17以上) | |
POSIX の rename によって行われたかのように、 old_p によって表されるファイルシステムオブジェクトを 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が存在するシンボリックリンクの場合、そのターゲットではなく、リンク自身が削除されます。
以下の場合、名前変更は失敗します。
new_pがドットまたはドット-ドットで終わる。new_pがディレクトリ区切り文字で終わる存在しないディレクトリを表す。old_pがnew_pの祖先ディレクトリである。
引数
| old_p | - | 移動または名前変更するパス |
| new_p | - | 移動または名前変更操作のターゲットパス |
| ec | - | 例外を投げないオーバーロードでエラーを報告するための出力引数 |
戻り値
(なし)
例外
std::error_code& 引数を取らないオーバーロードは、ベースとなる OS の API でエラーが発生した場合、第1パス引数に old_p、第2パス引数に new_p、エラーコード引数に OS のエラーコードを指定して構築された filesystem_error を投げます。 std::error_code& 引数を取るオーバーロードは、 OS の API 呼び出しが失敗した場合、その引数を OS の API のエラーコードに設定し、エラーが発生しない場合は ec.clear() を実行します。 noexcept 指定のないあらゆるオーバーロードは、メモリ確保に失敗した場合 std::bad_alloc を投げる可能性があります。
例
Run this code
#include <iostream>
#include <fstream>
#include <filesystem>
namespace fs = std::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);
}
関連項目
| ファイルの名前を変更します (関数) | |
(C++17)(C++17) |
ファイルまたは空のディレクトリを削除します ファイルまたはディレクトリおよびそのすべての内容を再帰的に削除します (関数) |