🐥

Rustでファイルを既定のアプリで開く(Windows限定)

に公開2

Rust でファイルを既定のファイルで開く(Windows 限定)

Rust を使ってファイルを既定のアプリで開くのに Windows の API を使ってたんですが、もっと単純な方法に気付いたのでメモ。

use std::process::Command;
use std::path::Path;

fn open_file(file_path: &str) -> std::io::Result<()> {
    if !Path::new(file_path).exists() {
        return Err(std::io::Error::new(std::io::ErrorKind::NotFound, "File not found"));
    }

    Command::new("cmd")
            .args(&["/C", "start", "", file_path])
            .spawn()?;
    Ok(())
}

fn main() {
    match open_file("C:\\path\\to\\your\\file.txt") {
        Ok(_) => println!("File opened successfully"),
        Err(e) => println!("Error opening file: {}", e),
    }
}

以上。
やっていることはコマンドプロンプトで実行させているだけです。
わざわざクレートを使うこともなく実装できるのでお手軽。

Discussion

funatsufumiyafunatsufumiya

NushellというクロスプラットフォームなシェルがRustで実装されているのですが、Nuは様々なコマンドがWin/Mac/Linux共通で使えるので、例えば embed_nu を経由して(あるいはcmd同様にnuから直接)コマンドプロンプト等と同じ発想でNuのコマンドを呼ぶと、例えばstartコマンドなどをWin/Mac/Linux共通で使えるので便利かもしれません。
https://docs.rs/embed-nu/latest/embed_nu/

デクノボーデクノボー

なるほど。確かにそれならOS問わずにできそうですね。
Nushell、面白そうなので少し触ってみようと思います。