指定したファイルのサイズ、作成日時、最終更新日時、パーミッションなどのメタデータ(属性情報)を取得する方法を解説します。
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/**" }]
}
]
}
※ 上記の例では $APPLOCALDATA(BaseDirectory.AppLocalData)配下のファイル属性情報(stat)取得を許可しています。アクセスするディレクトリに応じて、パス変数を指定してください。スコープが設定されていないディレクトリにはアクセスできません。
使用方法
@tauri-apps/plugin-fs から stat 関数をインポートして使用します。
import { stat } from '@tauri-apps/plugin-fs';
// メタデータの取得
const metadata = await stat('/path/to/file.txt');
戻り値の Metadata オブジェクトには以下のプロパティが含まれます。
| プロパティ | 型 | 説明 |
|---|---|---|
size | number | ファイルサイズ(バイト単位) |
mtime | Date | 最終更新日時 (Modification Time) |
atime | Date | 最終アクセス日時 (Access Time) |
birthtime | Date | 作成日時 (Creation Time) ※サポートされているOSのみ |
isFile | boolean | ファイルであれば true |
isDirectory | boolean | ディレクトリであれば true |
isSymlink | boolean | シンボリックリンクであれば true |
permissions | Permissions | パーミッション情報 (Unix系のみ有効な場合があります) |
1. フロントエンドから作成する (TypeScript)
@tauri-apps/plugin-fs の stat 関数を使用します。
基本的なファイル情報の取得
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: メタデータの取得にはこの権限が必要です。