一時ファイル用フォルダパスを取得する

Recipe ID: fs-019

システムの一時フォルダ(Temp ディレクトリ)のパスを取得する方法を解説します。
作業用ファイルやダウンロードキャッシュなど、アプリケーションの終了後や再起動後に削除されても問題ないデータを保存するために使用します。

前提条件

一時ファイルの作成などのために @tauri-apps/plugin-fs プラグインが必要です。

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

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

npm run tauri add fs

2. Permissions (権限) の設定

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

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

※ 上記の例では $TEMP(システムの一時フォルダ)配下でのファイル操作を許可しています。アクセスするディレクトリに応じて、パス変数を指定してください。スコープが設定されていないディレクトリにはアクセスできません。

使用方法

@tauri-apps/api/path から tempDir をインポートして使用します。

OSパス (例)
WindowsC:\Users\{User}\AppData\Local\Temp\
macOS/var/folders/xx/xxxx/T/
Linux/tmp/
注意: 取得されるパスはシステム全体の Temp フォルダです。ここにファイルを保存する場合は、ファイル名が衝突しないようにする必要があります(UUIDを使用したり、アプリ専用のサブフォルダを作成することを推奨します)。

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

@tauri-apps/api/pathtempDir 関数を使用します。

Temp ディレクトリのパスを取得する

import { tempDir } from '@tauri-apps/api/path';

async function showTempPath() {
    try {
        const tempPath = await tempDir();
        console.log('Temporary Directory:', tempPath);
        return tempPath;
    } catch (err) {
        console.error('Failed to get temp path:', err);
    }
}

安全な一時ファイルを作成する

システム Temp フォルダ内にアプリ専用のサブフォルダを作成し、そこにユニークなファイル名で一時ファイルを保存する例です。

import { tempDir, join } from '@tauri-apps/api/path';
import { mkdir, writeTextFile, exists } from '@tauri-apps/plugin-fs';

function generateUniqueId() {
    return Date.now().toString(36) + Math.random().toString(36).substr(2);
}

async function createTempFile(content: string) {
    try {
        // 1. システムのTempパスを取得
        const osTempDir = await tempDir();
        
        // 2. アプリ専用のサブディレクトリパスを作成
        // app_temp_files は任意のディレクトリ名
        const appTempDir = await join(osTempDir, 'my_tauri_app_temp');

        // 3. サブディレクトリがなければ作成
        if (!(await exists(appTempDir))) {
            await mkdir(appTempDir);
        }

        // 4. ユニークなファイル名を作成
        const fileName = `temp_${generateUniqueId()}.txt`;
        const filePath = await join(appTempDir, fileName);

        // 5. ファイルを書き込み
        await writeTextFile(filePath, content);
        
        console.log('Temp file created at:', filePath);
        return filePath;

    } catch (err) {
        console.error('Error creating temp file:', err);
    }
}

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

Rust では std::env::temp_dir を使用するか、Tauri の AppHandle から一時フォルダ(こちらはアプリ専用のものである場合が多い)を取得します。

システムの一時ディレクトリ取得

use std::env;

#[tauri::command]
fn get_system_temp_dir() -> String {
    env::temp_dir().to_string_lossy().into_owned()
}

アプリ専用の一時ファイル作成

Tauri の app.path().temp_dir() は、通常システムのTempディレクトリを指しますが、将来的にアプリ専用の場所に変わる可能性もあります(API仕様による)。ここでは確実に一時ファイルを作る例を示します。

ユニークなファイル名を作成するために uuid クレートを使用します。src-tauri/Cargo.toml に以下を追加してください。

[dependencies]
uuid = { version = "1.0", features = ["v4"] }
use std::env;
use std::fs;
use uuid::Uuid;

#[tauri::command]
fn create_temp_file_rust(content: String) -> Result<String, String> {
    let mut temp_path = env::temp_dir();
    temp_path.push("my_tauri_app_temp");

    // フォルダ作成
    if !temp_path.exists() {
        fs::create_dir_all(&temp_path).map_err(|e| e.to_string())?;
    }

    // ユニークなファイル名
    let file_name = format!("{}.txt", Uuid::new_v4());
    temp_path.push(file_name);

    fs::write(&temp_path, content).map_err(|e| e.to_string())?;

    Ok(temp_path.to_string_lossy().into_owned())
}

アプリ終了時のクリーンアップについて

一時ファイルは OS によって自動的に削除されることもありますが、確実ではありません。
特にアプリ専用のサブディレクトリを作成した場合は、不要になったタイミングやアプリ起動時に古い一時ファイルを削除する処理(クリーンアップ)を実装マナーとして推奨します。

補足

  • クリーンアップ: 一時ファイルは OS によって自動削除される場合がありますが、確実ではありません。不要になったら remove (fs-008, fs-007) で削除する処理を入れるのが望ましいです。
  • セキュリティ: Temp フォルダは全ユーザー(または同一ユーザーの全アプリ)からアクセス可能な場合があるため、機密情報の保存には適していません。