Rustで引数のファイルをゴミ箱に移すだけの実行ファイルを作成した

引数に指定されたファイルをゴミ箱に移すだけのexeファイルをRustで作成した。

exeにドラッグアンドドロップでファイルのゴミ箱行きに利用できる。フォルダのドロップはどうなるかわからない。

目的

ファイルの整理で使うつもりで作成した。

ビューアが外部実行ファイルの起動に対応しているため、ビューアでファイルを確認しながら処理すべきファイルを見つけたら、exeを実行して、対象ファイルを削除する。

powershellで書くと外部実行ファイルとしての実行が面倒だったのでRustで確実な実行ファイルを作成したという次第。

使ったcrate

trashクレートを使った。感謝。日本語環境でいうゴミ箱にファイルを移してくれる。こちらにリンク:

https://crates.io/crates/trash

コード全体

引数に渡されたファイルをそのままtrashクレートに渡すだけなので、とても短い。なのでここに載せるだけでいいだろう。

use std::env;
use trash;

fn main() {
    let exe_pathbuf = env::current_exe().unwrap();
    let prog_name = exe_pathbuf.file_name().unwrap().to_str().unwrap();
    // フォルダ名を除いたファイル名を取得し、比較する。引数のはそのままでいい。後ろがマッチすれば十分。

    for argument in env::args() {
        if argument.ends_with(prog_name) {
            println!("this arguement {} is exe file!!! so skip this!", argument);
            continue;
        }
        print!("...deleting {}", argument);
        match trash::delete(argument) {
            Ok(_) => println!("... ok!"),
            Err(e) => println!("... error!! {}", e.to_string()),
        }
    }
}

第一引数はこの実行ファイルのパスである可能性が高いので、これはRustで取得できる実行ファイル名と比較して同じであればスキップするようにした。

それ以外は渡された引数をそのままtrash::delete()関数に渡すだけ。

すぐに削除は終了するので、メッセージを見る暇などないが、一応出力させている。

実行ファイルを小さくする工夫

簡単にできるものだけ指定した。Cargo.tomlに指定する:

[dependencies]
trash = "3.0.6"


# ref: https://github.com/johnthagen/min-sized-rust
[profile.release]
strip = true  # Automatically strip symbols from the binary.
opt-level = "z"  # Optimize for size.
lto = true
codegen-units = 1
panic = "abort"

[profile.release]に指定する。書かれているように、以下のサイトをそのまま使わせていただいた:

GitHub - johnthagen/min-sized-rust: 🦀 How to minimize Rust binary size 📦
🦀 How to minimize Rust binary size 📦. Contribute to johnthagen/min-sized-rust development by creating an account on GitH...

nightlyな項目は使っていないので、もう少し小さくできそうだ。ちなみにこの設定だと180 KB (184,320 バイト)になった(プロパティから見られるディスク上のサイズ)。

おわり

無事に目的のことに使用できて安心した。整理を後でしようと思ってて削除や移動を後回しにしていたのでようやく処理できそうだ。

以上です。

タイトルとURLをコピーしました