Namespaces
Variants

std::filesystem:: rename

From cppreference.net
定義先ヘッダ <filesystem>
void rename ( const std:: filesystem :: path & old_p,
const std:: filesystem :: path & new_p ) ;
(1) (C++17以降)
void rename ( const std:: filesystem :: path & old_p,

const std:: filesystem :: path & new_p,

std:: error_code & ec ) noexcept ;
(2) (C++17以降)

old_p で識別されるファイルシステムオブジェクトを new_p へ移動または名称変更します。この操作はPOSIXの rename 関数と同等の動作を行います:

  • 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 と同じディレクトリ、またはそのハードリンクの場合:このケースでは何も行われません。
  • 既存のディレクトリの場合: new_p はPOSIXシステムでは空であれば削除されますが、他のシステムではエラーとなる可能性があります。エラーでない場合、 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 dot または dot-dot で終了している。
  • new_p がディレクトリセパレータで終了する存在しないディレクトリを指定している。
  • old_p new_p の先祖ディレクトリである。

目次

パラメータ

old_p - 移動または名前変更するパス
new_p - 移動/名前変更操作のターゲットパス
ec - 例外を投げないオーバーロードでのエラー報告用出力パラメータ

戻り値

(なし)

例外

noexcept でマークされていないオーバーロードは、 メモリ確保に失敗した場合に std::bad_alloc をスローする可能性があります。

1) 基盤となるOS APIエラーが発生した場合 std::filesystem::filesystem_error をスローします。この例外は old_p を第一パス引数、 new_p を第二パス引数、OSエラーコードをエラーコード引数として構築されます。
2) OS API呼び出しが失敗した場合、 std:: error_code & パラメータにOS APIエラーコードを設定し、エラーが発生しなかった場合は ec. clear ( ) を実行します。

#include <filesystem>
#include <fstream>
namespace fs = std::filesystem;
int main()
{
    std::filesystem::path p = std::filesystem::current_path() / "sandbox";
    std::filesystem::create_directories(p / "from");
    std::ofstream{ p / "from/file1.txt" }.put('a');
    std::filesystem::create_directory(p / "to");
//  fs::rename(p / "from/file1.txt", p / "to/"); // エラー: "to" はディレクトリ
    fs::rename(p / "from/file1.txt", p / "to/file2.txt"); // OK
//  fs::rename(p / "from", p / "to"); // エラー: "to" は空ではない
    fs::rename(p / "from", p / "to/subdir"); // OK
    std::filesystem::remove_all(p);
}

関連項目

ファイルの名前を変更する
(function)
(C++17) (C++17)
ファイルまたは空のディレクトリを削除する
ファイルまたはディレクトリとそのすべての内容を再帰的に削除する
(function)