2020年2月5日水曜日

Qt ゴミ箱の実装


Qtのファイル削除
Qtで少しずつ画像のビューアを作り込んでいるんだが、常用するには不要な画像を削除する機能が必須で、これ自体はQtで簡単に実装出来たんだけど、完全に消えてしまってゴミ箱への一時避難とはならなかった。

実はゴミ箱が少し難しいことは昔経験済みだったんだが、Qtはそこら辺もしっかり対応してくれてるものだと思っていたのさ
調べるとそもそもLinuxにはゴミ箱は無いようで(そうだったかな?)考えたらスマホにも無い、ファイル削除に際してゴミ箱ってものを考えたのはMicrosoftの手柄だったのかもしれない。ゴミ箱は凄く便利だし慣れたら欠かせないから

QtCreatorの問題
で、win環境でゴミ箱を実装するにはwinのAPIを使うしかないようだ
そのためにはwinのSDKからヘッダやライブラリを持ってこなくちゃいけないわけだが、やり方がわかんない
ネットでソースのサンプルは見つけたので試してみたらそもそもQtCreatorがヘッダが見つからないとエラーを吐いて進まない┐('д')┌
コンパイラとしてVSをインストした時にSDKもインストしたはずだから私のPCにあるとは思うんだけど
今のところネットでも調べ切れてなくて悩み中です

ちょっと力が入らないのは出来たとしてもwin限定になってしまうから
Linuxで使えないとしたら汎用性がない
OSに依存しないのがウリのQT開発だからなあ

ゴミ箱とは
そもそもゴミ箱って、単にフォルダを移動するだけじゃなくて元に戻す機能ってのもあるよね
ファイルを削除しようとしたら関連ファイルも削除するか聞かれたことがあったような気がする
MSは削除について結構考えてる
基本は削除の確認だけでは足りなくてもう一段階保険をかけておくってことだと思う
近年一気に普及したPCにwinのOSとかマウスの果たした役割は大きいと思うがゴミ箱の思想も重要だったのかもしれない

実装プラン
で、実装だが、単に特殊フォルダを自作して移動でも良いような気がしてきた
削除するファイルのあるドライブのルートに「_trash_」みたいなフォルダを作ってそこに移動する
そして定期的にそのフォルダを開いて自分で完全に削除する、そうしたらほぼゴミ箱に近い
もとに戻したければそのフォルダにログでも作って保存しておけば良いと思うがそこまでする必要はないのでしない
これならLinuxでもいけるし今のQtの枠組みで収まる
_trash_は各ドライブ毎に作られるから全てのドライブをスキャンしてまとめて表示するようなアプリを作っても良いかな
各ドライブ毎に_trash_を作るのは移動に際してコピペが発生しないのでシステムへの負担が少ないだろうから
winのゴミ箱も似たような仕組みではなかろうか??
簡単そうなのでやってみるか

-----------------------------------------------
実装プラン2~python~
ふと思いついてpythonを調べたらあった
send2trash ってそのまんまのモジュール
win・linux・macで動くそうでスグレモノですなあ
で、Qtからpythonに投げて処理することにした
pyを書こうとおもったがインポートして命令1行で簡単なのでQtから直接コマンドを投げることにしてうまくいった

自作のGViewerに実装済み
削除したらすぐフォルダのリストを再作成するようにしたら削除ファイルがリストに残るバグがあった
pythonをprocess.detacheで起動してるんだがタイムラグがあるんだと思う
リストの再作成までに300ミリ秒くらいタイマーでスリープさせたらうまくいった
process.startで終了を待てば良いんだろうけど何故か上手くいかないのさ

注意
pythonに削除ファイルをフルパスで投げるとき、区切り文字を二重にしないとダメみたいだ
パイソンはそんなこと気にしないから多分Qt側でだめになるんだろう
パスを作るのがめんどくさい┐('д')┌
で、パス無しのファイル名だけにしたら上手くいった
カレントフォルダは移動しないんだな、めでたしめでたし

0 件のコメント:

コメントを投稿