【C++17】std::filesystem::rename でファイルやディレクトリの名前を変更/移動する方法

目次

はじめに

C++で、プログラムからファイルやディレクトリの名前を変更したり、別のディレクトリへ移動させたりしたい場合があります。

C++17で導入された <filesystem> ライブラリは、このための**std::filesystem::rename()**という関数を提供しています。この関数は、OSの move コマンドのように振る舞い、ファイル/ディレクトリの名前変更と移動の両方の役割を果たします。


【前提】C++17とは?

C++17は、2017年に正式化されたC++言語の規格です。<filesystem> ライブラリはこのC++17で導入されたため、利用するにはC++17に対応したコンパイラと、適切なコンパイラ設定(および、一部の環境ではリンカ設定)が必要になります。


rename() を使ったサンプルコード

このコードは、まずテスト用のファイル old_name.txt を作成し、それを rename() を使って new_name.txt という新しい名前に変更します。

完成コード

#include <iostream>
#include <filesystem>
#include <fstream>    // ofstream

// filesystem名前空間のエイリアス
namespace fs = std::filesystem;

int main() {
    fs::path original_path = "old_name.txt";
    fs::path new_path = "new_name.txt";
    
    // 1. テスト用のファイルを作成
    std::ofstream test_file(original_path);
    test_file.close();

    std::cout << "変更前: " << std::endl;
    std::cout << "「" << original_path << "」は存在しますか? -> " << std::boolalpha << fs::exists(original_path) << std::endl;
    std::cout << "「" << new_path << "」は存在しますか? -> " << std::boolalpha << fs::exists(new_path) << std::endl;

    try {
        // 2. rename()で、ファイル名を変更
        fs::rename(original_path, new_path);
        
        std::cout << "\n--- rename()実行後 ---" << std::endl;
        std::cout << "「" << original_path << "」は存在しますか? -> " << std::boolalpha << fs::exists(original_path) << std::endl;
        std::cout << "「" << new_path << "」は存在しますか? -> " << std::boolalpha << fs::exists(new_path) << std::endl;

    } catch (const fs::filesystem_error& e) {
        std::cerr << "エラーが発生しました: " << e.what() << std::endl;
    }
    
    // 3. 後片付け
    if (fs::exists(new_path)) {
        fs::remove(new_path);
    }
    
    return 0;
}

コードの解説

fs::rename(from, to)

  • 機能: 第1引数 from で指定されたパスを、第2引数 to で指定されたパスに名前変更または移動します。
  • 引数: std::filesystem::path オブジェクトだけでなく、パスを表す文字列リテラルを直接渡すこともできます。
  • 動作:
    • 名前の変更: fromto が同じディレクトリにある場合、ファイル/ディレクトリの名前が変更されます。(今回の例)
    • 移動: fromto が異なるディレクトリにある場合、to で指定された場所にファイル/ディレクトリが移動します。
  • エラー処理:
    • from が存在しない場合や、to が既に存在するファイルである場合など、操作に失敗すると std::filesystem::filesystem_error 例外をスローします。

まとめ

今回は、C++17の <filesystem> ライブラリを使って、ファイルやディレクトリの名前変更・移動を行う rename() 関数について解説しました。

  • <filesystem> ヘッダーをインクルードする。
  • fs::rename(変更前のパス, 変更後のパス) の形で呼び出す。
  • この関数は名前変更移動の両方の機能を持つ。
  • 操作に失敗すると例外を投げるため、try-catch でのエラーハンドリングが推奨される。

OSのコマンドラインツールを呼び出す必要なく、C++の標準機能だけで、クロスプラットフォームなファイル/ディレクトリの名前変更・移動処理を安全に記述できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次