ファイルパスから拡張子を取り出す

Recipe ID: fs-024

ファイルパス文字列から拡張子部分(例: .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/pathextname 関数を使用します。

ファイル名の拡張子に基づいて処理を分岐する

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 のような二重拡張子の場合、extnameextension() は最後の .gz しか返さないのが一般的です。