ファイル名を変更する(リネーム)

Recipe ID: fs-009

ファイルやディレクトリの名前を変更する方法を紹介します。
この機能は、単なる名前変更だけでなく、ファイルを別のディレクトリに移動する場合(Move)にも使用されます。

前提条件

このレシピを使用するには、@tauri-apps/plugin-fs プラグインが必要です。

1. プラグインのインストール

プロジェクトのルートディレクトリで以下のコマンドを実行してプラグインを追加します。

npm run tauri add fs

2. Permissions (権限) の設定

src-tauri/capabilities/default.json に以下の権限を追加します。

{
  "permissions": [
    ...,
    {
      "identifier": "fs:allow-rename",
      "allow": [{ "path": "$APPLOCALDATA/**" }]
    }
  ]
}

※ 上記の例では $APPLOCALDATABaseDirectory.AppLocalData)配下でのリネーム(移動)を許可しています。アクセスするディレクトリに応じて、パス変数を指定してください。スコープが設定されていないディレクトリにはアクセスできません。

1. フロントエンドから作成する (TypeScript)

@tauri-apps/plugin-fsrename 関数を使用します。

同一ディレクトリ内でのリネーム

ファイル名を old_name.txt から new_name.txt に変更します。

import { rename, BaseDirectory } from '@tauri-apps/plugin-fs';

async function renameFile() {
  try {
    // oldPath と newPath の両方に同じ BaseDirectory を指定します
    await rename('old_name.txt', 'new_name.txt', {
      oldPathBaseDir: BaseDirectory.AppLocalData,
      newPathBaseDir: BaseDirectory.AppLocalData,
    });
    console.log('ファイル名を変更しました');
  } catch (err) {
    console.error('リネームエラー:', err);
  }
}

ファイルを別のディレクトリに移動する

rename 関数を使用してファイルを移動することも可能です。
(移動先のディレクトリが存在している必要があります)

import { rename, BaseDirectory } from '@tauri-apps/plugin-fs';

async function moveFileToArchive() {
  try {
    // current/data.txt を archive/data_2024.txt に移動
    await rename('current/data.txt', 'archive/data_2024.txt', {
      oldPathBaseDir: BaseDirectory.AppLocalData,
      newPathBaseDir: BaseDirectory.AppLocalData,
    });
    console.log('ファイルをアーカイブフォルダに移動しました');
  } catch (err) {
    console.error('移動エラー:', err);
  }
}

2. バックエンドから作成する (Rust)

Rust の std::fs を使用します。
リネームと移動は同じ rename 関数で行います。

ファイル名変更(または移動)

use std::fs;

#[tauri::command]
fn rename_file(old_path: String, new_path: String) -> Result<(), String> {
    // 移動先のディレクトリが存在しないとエラーになる場合があります(OS依存)
    fs::rename(old_path, new_path).map_err(|e| e.to_string())
}

ディレクトリの移動

ディレクトリ自体を移動(リネーム)することも可能です。

use std::fs;

#[tauri::command]
fn move_directory(old_dir: String, new_dir: String) -> Result<(), String> {
    fs::rename(old_dir, new_dir).map_err(|e| e.to_string())
}

補足

  • rename: Rust でも std::fs::rename を使用します。
  • ファイルシステムの境界: Unix系 OS では、パーティションやファイルシステムを跨ぐ移動(例: /tmp から /home へ)の場合、rename は失敗することがあります。その場合は「コピーして削除」を行う必要があります。
  • BaseDirectory: フロントエンド API では、移動元と移動先で異なる BaseDirectory を指定できます。