新しいディレクトリ(フォルダ)を作成する

Recipe ID: fs-006

ローカルファイルシステム上に新しいディレクトリを作成する方法を紹介します。
ログ保存用のフォルダや、ユーザーデータのエクスポート先を作成する際などに使用します。

前提条件

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

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

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

npm run tauri add fs

2. Permissions (権限) の設定

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

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

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

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

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

基本的なディレクトリ作成

指定した場所にディレクトリを作成します。

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

async function createLogsDirectory() {
  try {
    await mkdir('logs', {
      baseDir: BaseDirectory.AppLocalData,
    });
    console.log('ディレクトリを作成しました');
  } catch (err) {
    console.error('ディレクトリ作成エラー:', err);
  }
}

再帰的なディレクトリ作成(ネストされたフォルダ)

recursive: true オプションを指定すると、親ディレクトリが存在しない場合に親ディレクトリも含めて一括で作成します(コマンドラインの mkdir -p に相当)。

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

async function createDeepDirectory() {
  try {
    // 2024/01/data のように深い階層を一気に作成
    await mkdir('2024/01/data', {
      baseDir: BaseDirectory.AppLocalData,
      recursive: true, 
    });
    console.log('ネストされたディレクトリを作成しました');
  } catch (err) {
    // 既に存在する場合はエラーにならない場合がありますが、
    // 環境や状況によってはエラーハンドリングが必要な場合があります
    console.error('作成失敗:', err);
  }
}

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

Rust の std::fs を使用します。

ディレクトリの作成

use std::fs;

#[tauri::command]
fn create_directory(path: String) -> Result<(), String> {
    // std::fs::create_dir は親ディレクトリが存在しないとエラーになります
    fs::create_dir(path).map_err(|e| e.to_string())
}

再帰的なディレクトリ作成

use std::fs;

#[tauri::command]
fn create_deep_directory(path: String) -> Result<(), String> {
    // std::fs::create_dir_all は mkdir -p と同様に親ディレクトリも作成します
    fs::create_dir_all(path).map_err(|e| e.to_string())
}

補足

  • recursive: true: 深い階層のディレクトリを作る際や、ディレクトリが既に存在する場合にエラーを避けたい場合に便利です。Rust では create_dir_all がこれに相当します。
  • エラー処理: 既にディレクトリが存在する場合、create_dir_all はエラーになりませんが、create_dir はエラーになります(Rust)。