Namespaces
Variants

std::experimental::filesystem:: rename

From cppreference.net
定義先ヘッダ <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 で識別されるファイルシステムオブジェクトを 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 - 例外を投げないオーバーロードでのエラー報告用出力パラメータ

戻り値

(なし)

例外

The overload that does not take an error_code & parameter throws filesystem_error on underlying OS API errors, constructed with old_p as the first argument, new_p as the second argument, and the OS error code as the error code argument. std:: bad_alloc may be thrown if memory allocation fails. The overload taking an error_code & parameter sets it to the OS API error code if an OS API call fails, and executes ec. clear ( ) if no errors occur. This overload has
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);
}

関連項目

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