1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rust + Dioxus でバックアップツールを作ってみた

Last updated at Posted at 2025-10-25

出来上がったものがこちらです

なぜ、この記事を書こうと思ったのか

フリーソフトでバックアップツールはたくさんあると思うのですが、最近の Rust + Dioxus 熱の高まりで自分でもバックアップツールを作ってみようと思いました。
作っていく中で、
ファイルコピー時にCPUの数分スレッドを作成してコピーする処理

タスクバーアイコンに進捗バーを設定するやり方

onclick中に表示した警告ダイアログが応答不能になる問題を回避する方法
など勉強になったことがあったので、今回記事にまとめてみました。
Rustやdioxusに興味がある人や上記のやり方が分からずに困っている人には参考になるかもしれません。

使い方

バックアップ元、バックアップ先を設定して実行ボタンを押すとバックアップ処理が開始されます。
test.gif

こだわった点

実行中は入力不可にする

実行中は、GUIへの入力を出来ないようにしたかったのでWorkStateが変更されるたびにis_running変数を更新して、true時に入力不可にしてみました。

ツール起動時と終了時にGUIの情報をローカルにload,saveする

Windowsの位置とサイズ。GUIのバックアップ先とバックアップ元は、jsonにまとめてローカルファイルにsave,するようにしました。
上記の情報はツール起動時にjsonからloadされます。

自分の場合は以下にjsonを保存することが多いです。
C:\Users\(ユーザー名)\Documents\script\Rust\*.json

ファイルコピー時にCPUの数分スレッドを作成してコピーする

ファイルコピー処理をスレッド化して、常にCPUがフルで活用されている状態にするようにしてみました。

バックアップ元の設定をtextareaにする

こだわった点とはちょっと違うかもしれませんが、バックアップ先がinputでバックアップ元がtextareaにするのは違和感があったのですがそこは使いやすさ優先にしました。
504970158-881553a2-eba2-4957-b98b-91820092c97c.png

苦労した点

タスクバーアイコンに進捗バーを設定する

output.gif
タスクバーのアイコンの下にあるバーに進捗バーを設定したかったので、色々調べた結果winsafeクレートで実現できそうなのでやってみました。
WindowsAPIは、書き方が独特なのでなんか好きになれないですね。。。
(それでもwinsafeクレートで大分書きやすくなっているとは思います。いつもありがとうございます。<(__)>)
2~3日調べてようやく出来ました。
今回、1番苦労した箇所です。

onclick 中の処理でダイアログが固まる点

ボタンを押したときのonclick: move |_| の処理でnative_dialogクレートのダイアログを表示するとツールが固まる問題に悩まされました。。。
結論から書くと onclick: move |_| onclick: move |_| async move で非同期処理にすると解決できました。

まとめ

Dioxusを使い始めて1年くらい経つのですが、ようやく少し慣れてきた気がします。
特に今回は色々困っていたことが解決できたので、少し成長できたかなと思えて嬉しかったです。
良かったら使ってみてください。(*´∀`)ノ

参考にさせていただいたサイト

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?