テキストファイルに書き込む

Recipe ID: fs-002

ローカルファイルシステム上のファイルにテキストデータ(文字列)を書き込む方法を紹介します。
アプリの設定データの保存、ログの出力、ユーザー作成ドキュメントの保存などに利用されます。

前提条件

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

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

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

npm run tauri add fs

2. Permissions (権限) の設定

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

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

※ 上記の例では $APPLOCALDATABaseDirectory.AppLocalData に対応)配下の書き込みを許可しています。アクセスするディレクトリに応じて、$APPCONFIG, $RESOURCE, $HOME などのパス変数を指定してください。スコープが設定されていないディレクトリにはアクセスできません。

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

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

基本ディレクトリ(BaseDirectory)を指定して書き込む

Tauri が提供する BaseDirectory を使用して、OS ごとの適切なパスにファイルを保存します。

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

async function saveText() {
  try {
    // $APPLOCALDATA/memo.txt に "Hello Tauri" と書き込む
    // ファイルが存在しなければ作成され、存在すれば上書きされます
    await writeTextFile('memo.txt', 'Hello Tauri', {
      baseDir: BaseDirectory.AppLocalData
    });
    console.log('書き込み完了');
  } catch (err) {
    console.error('書き込みエラー:', err);
  }
}

JSON オブジェクトを保存する

設定ファイルなどを保存する際の一般的なパターンです。オブジェクトを JSON 文字列に変換して書き込みます。

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

interface AppSettings {
  username: string;
  theme: 'light' | 'dark';
  notifications: boolean;
}

async function saveSettings(settings: AppSettings) {
  try {
    const data = JSON.stringify(settings, null, 2); // 見やすく整形
    
    await writeTextFile('settings.json', data, {
      baseDir: BaseDirectory.AppLocalData
    });
    
    console.log('設定を保存しました');
  } catch (err) {
    console.error('設定の保存に失敗:', err);
  }
}

絶対パスで書き込む

絶対パスを使用する場合も、そのパスが Capabilities の scope で許可されている必要があります。

import { writeTextFile } from '@tauri-apps/plugin-fs';

// 事前に Permissions で許可されたパスであること
const absolutePath = '/path/to/my/output.txt';

await writeTextFile(absolutePath, 'This content is written via absolute path.');

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

Rust の標準ライブラリを使用してファイルに書き込みます。

基本的な書き込み

use std::fs;

#[tauri::command]
fn write_text_file(path: String, contents: String) -> Result<(), String> {
    fs::write(path, contents).map_err(|e| e.to_string())
}

アプリのデータディレクトリに保存

use tauri::Manager;
use std::fs;

#[tauri::command]
fn save_config(app: tauri::AppHandle, config_json: String) -> Result<(), String> {
    let local_data_dir = app.path().app_local_data_dir()
        .map_err(|e| e.to_string())?;

    // ディレクトリが存在しない場合は作成
    if !local_data_dir.exists() {
        fs::create_dir_all(&local_data_dir).map_err(|e| e.to_string())?;
    }
    
    let file_path = local_data_dir.join("config.json");
    fs::write(file_path, config_json).map_err(|e| e.to_string())
}

補足

  • 上書き: 指定したファイルが既に存在する場合、内容は完全に上書きされます。追記(Append)を行いたい場合は、fs-005 を参照するか、Rust 側で OpenOptions::append(true) を使用します。
  • ディレクトリの作成: writeTextFilestd::fs::write は、指定したパスの親ディレクトリが存在しない場合エラーになります。階層深いディレクトリに保存する場合は、事前にディレクトリを作成してください。
  • セキュリティ: fs:scope の設定はフロントエンドからのアクセスに適用されます。Rust からのアクセスには適用されませんが、安全のため適切なディレクトリ(AppLocalData など)を使用することを推奨します。