名前空間
変種
操作

std::filesystem::rename

From cppreference.com
 
 
 
ヘッダー <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 で識別されるファイルシステムオブジェクトを、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 が既存のシンボリックリンクの場合、そのターゲットではなく、シンボリックリンク自体が削除されます。

名前変更は以下の場合に失敗します。

  • new_pドット または ドットドット で終わる場合。
  • new_p が、ディレクトリ区切り文字で終わる存在しないディレクトリを指定する場合。
  • old_p が、 new_p の祖先であるディレクトリの場合。

目次

[編集] パラメータ

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

[編集] 戻り値

(なし)

[編集] 例外

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

1) 基盤となる OS API エラーが発生した場合、 std::filesystem::filesystem_error をスローします。この例外は、最初のパス引数として old_p、2番目のパス引数として 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/"); // 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
 
    std::filesystem::remove_all(p);
}

[編集] 関連項目

ファイル名を変更する
(関数) [編集]
(C++17)(C++17)
ファイルまたは空のディレクトリを削除する
ファイルまたはディレクトリとその内容をすべて再帰的に削除する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)