ファイルのメタデータ(サイズ・作成日時・更新日時)を取得する

Recipe ID: fs-015

指定したファイルのサイズ、作成日時、最終更新日時、パーミッションなどのメタデータ(属性情報)を取得する方法を解説します。
Tauri では fs プラグインの stat 関数を使用することで、std::fs::metadata に相当する情報を取得できます。

前提条件

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

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

npm run tauri add fs

2. Permissions (権限) の設定

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

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

※ 上記の例では $APPLOCALDATABaseDirectory.AppLocalData)配下のファイル属性情報(stat)取得を許可しています。アクセスするディレクトリに応じて、パス変数を指定してください。スコープが設定されていないディレクトリにはアクセスできません。

使用方法

@tauri-apps/plugin-fs から stat 関数をインポートして使用します。

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

// メタデータの取得
const metadata = await stat('/path/to/file.txt');

戻り値の Metadata オブジェクトには以下のプロパティが含まれます。

プロパティ説明
sizenumberファイルサイズ(バイト単位)
mtimeDate最終更新日時 (Modification Time)
atimeDate最終アクセス日時 (Access Time)
birthtimeDate作成日時 (Creation Time) ※サポートされているOSのみ
isFilebooleanファイルであれば true
isDirectorybooleanディレクトリであれば true
isSymlinkbooleanシンボリックリンクであれば true
permissionsPermissionsパーミッション情報 (Unix系のみ有効な場合があります)

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

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

基本的なファイル情報の取得

import { stat, BaseDirectory } from '@tauri-apps/plugin-fs';
// ホームディレクトリなどのパス解決用
import { appLocalDataDir, join } from '@tauri-apps/api/path';

async function checkFileInfo() {
  try {
    // 例: アプリのデータディレクトリにある 'example.txt' を対象
    const dataDir = await appLocalDataDir();
    const filePath = await join(dataDir, 'example.txt');

    const info = await stat(filePath);

    console.log(`File: ${filePath}`);
    console.log(`Size: ${info.size} bytes`);
    console.log(`Last Modified: ${info.mtime}`);
    console.log(`Created: ${info.birthtime}`);
    
    if (info.isFile) {
        console.log("This is a file.");
    } else if (info.isDirectory) {
        console.log("This is a directory.");
    }
  } catch (error) {
    console.error('Failed to get file info:', error);
  }
}

ファイルサイズを読みやすい形式に変換する

サイズ(バイト)を KB, MB などに変換して表示する実用的な例です。

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

function formatBytes(bytes: number, decimals = 2) {
    if (bytes === 0) return '0 Bytes';
    const k = 1024;
    const dm = decimals < 0 ? 0 : decimals;
    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
    const i = Math.floor(Math.log(bytes) / Math.log(k));
    return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
}

async function showFileSize(path: string) {
    try {
        const info = await stat(path);
        const formattedSize = formatBytes(info.size);
        console.log(`Size of ${path}: ${formattedSize}`);
        return formattedSize;
    } catch (err) {
        console.error(err);
        return 'Unknown';
    }
}

ファイルかディレクトリかを判定する

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

async function isDirectorySafe(path: string) {
    try {
        const info = await stat(path);
        return info.isDirectory;
    } catch (err) {
        // 存在しない、またはアクセス権がない場合
        console.error("Error accessing path:", err);
        return false;
    }
}

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

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

メタデータ情報の取得

use std::fs;
use std::time::SystemTime;

#[tauri::command]
fn get_file_metadata(path: String) -> Result<String, String> {
    let metadata = fs::metadata(path).map_err(|e| e.to_string())?;
    
    let size = metadata.len();
    let is_dir = metadata.is_dir();
    let readonly = metadata.permissions().readonly();
    
    // 日付情報の取得 (SystemTime)
    let modified = metadata.modified()
        .map_err(|e| e.to_string())
        .and_then(|t| t.duration_since(SystemTime::UNIX_EPOCH).map_err(|e| e.to_string()))
        .map(|d| d.as_secs())
        .unwrap_or(0);

    Ok(format!(
        "Size: {} bytes, IsDir: {}, ReadOnly: {}, Modified: {}", 
        size, is_dir, readonly, modified
    ))
}

補足

  • 日付情報: birthtime (作成日時) は、ファイルシステムや OS によってはサポートされていない(または正しく取得できない)場合があります(特に Linux の一部のファイルシステムなど)。
  • fs:allow-stat: メタデータの取得にはこの権限が必要です。