名前空間
変種
操作

std::filesystem::rename

提供: cppreference.com
 
 
 
ヘッダ <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_pnew_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 を投げる可能性があります。


[編集]

#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);
}


[編集] 関連項目

ファイルの名前を変更します
(関数) [edit]
(C++17)(C++17)
ファイルまたは空のディレクトリを削除します
ファイルまたはディレクトリおよびそのすべての内容を再帰的に削除します
(関数) [edit]