ファイルパス文字列から拡張子部分(例: .txt, .png)のみを抽出する方法を解説します。
Tauri の @tauri-apps/api/path モジュールにある extname 関数を使用します。
使用方法
@tauri-apps/api/path から extname をインポートして使用します。
import { extname } from '@tauri-apps/api/path';
// 拡張子を取得
const ext = await extname('photo.jpg');
// 結果: 'jpg' (ドットは含まれない場合が多いですが、Tauriのバージョンや実装によります。現在は主に拡張子名のみが返されます)
注意:extnameの戻り値にドット.が含まれるかどうかは、Rust のstd::path::Path::extensionの挙動に準拠します。通常、ドットは含まれません。コード内で使用する際はコンソール出力などを確認してください。
1. フロントエンドから作成する (TypeScript)
@tauri-apps/api/path の extname 関数を使用します。
ファイル名の拡張子に基づいて処理を分岐する
import { extname } from '@tauri-apps/api/path';
async function processFile(filePath: string) {
try {
const ext = await extname(filePath);
console.log(`Extension: ${ext}`); // 'png', 'txt' etc.
if (ext === 'png' || ext === 'jpg') {
console.log('Processing image...');
} else if (ext === 'txt' || ext === 'md') {
console.log('Processing text...');
} else {
console.log('Unknown file type');
}
} catch (err) {
console.error('Error extracting extension:', err);
}
}
拡張子の変更(置換)
extname は拡張子を取得するだけなので、変更には文字列操作が必要です。
import { extname } from '@tauri-apps/api/path';
async function isMarkdown(path: string) {
const ext = await extname(path);
return ext.toLowerCase() === 'md';
}
2. バックエンドから作成する (Rust)
Rust の std::path::Path を使用します。
拡張子の取得
use std::path::Path;
#[tauri::command]
fn get_extension(path: String) -> String {
Path::new(&path)
.extension()
.and_then(|ext| ext.to_str())
.unwrap_or("")
.to_string()
}
拡張子の変更
Rust の PathBuf には set_extension メソッドがあり便利です。
use std::path::PathBuf;
#[tauri::command]
fn change_extension(path: String, new_ext: String) -> String {
let mut p = PathBuf::from(path);
p.set_extension(new_ext);
p.to_string_lossy().into_owned()
}
補足
- ドットの扱い:
extnameや Rust のextension()は通常、ドットを含まない拡張子文字列(例:png)を返しますが、環境やバージョンによって異なる可能性があるため、実装時にはデバッグ出力で確認することをお勧めします。 - 多重拡張子:
tar.gzのような二重拡張子の場合、extnameやextension()は最後の.gzしか返さないのが一般的です。