ファイルマネージャの作成

ブログ コンピュータ
ブログ

WPFを使ったファイルマネージャを作成中です。

何年も前から、挑戦し何度も挫折しています。今回も挫折するかもしれないので、せめて進捗だけでも残そうと記事を書きました。

ファイルマネージャを作る目的は、ファイルやフォルダが増えてくると、ファイル名(フォルダ名)だけでは、何の目的で作成したかを識別することが難しくなります。ファイルやフォルダにコメントを記録してファイルマネージャで閲覧できると便利では無いかと考えました。

見た目はエクスプローラーのような上部にアドレスバー、左にフォルダのツリービュー、中央にカレントディレクトリのファイルの一覧、右側にファイルのプレビューになる予定です。

基本MVVMとDDDを意識した設計にしたいと思いますが、単体テストは楽しくないのでビューから作り始めています。

サイクルとして

XAMLでビューの一部を書く⇒バイドするデータソースをビューモデルに書く⇒ビューモデルで使う仮のモデルオブジェクトを作る⇒動作を確認⇒XAMLでビューの一部を書く(以降ループ)

といった感じです。

良い点は、ビューが少しづつ出来上がるようすがモチベーションが維持につながります。
悪い点は、場当たり的に作成しているので、完成に近づくほど、設計の悪い点が露呈してきます。

最初から完成までの筋道が見えている状態で設計出来れば良いですが、何度も作り直す必要が発生します。
その場合、残す機能と作り直す機能が疎結合だと都合が良いことを発見します。

20250602
アドレスバー、フォルダツリー、ファイルの一覧が動き始める。

ファイルの一覧にはListView、フォルダツリーにはTreeViewを使っていて、選択中のアイテムが変更されたことをきっかけに処理を行う必要があります。具体的にはカレントディレクトリの変更などで使われたり、実装していませんがファイルが選択された場合プレビュー表示などが考えられます。ListViewにもTreeViewにもSelectedItemというプロパティがあるのでそちらに、ViewModelのオブジェクトバインドしSubscribeで変更を通知を受け取り処理をすれば良さそうです。ListViewはそれで上手く行くのですが、TreeViewはSelectedItemが公開(public)されていないらしく、バインドすることが出来ません。しかたが無いのでイベントを捕まえてコマンド変換でしてViewModelのコマンドを呼び出すようにしました。

ちなみに、Geminiに相談したところ、TreeViewでもSelectedItemとバンドするように提案されました。ChatGPTに相談したところTreeViewのSelectedItemはバインドできないので、コードビハインドかイベントをコマンドを変換する方法を提案されました。ちがいがあって面白いです。

TreeViewやListViewのItemとなるオブジェクト用のクラスをドメイン層で定義して、インフラ層でフォルダの一覧を取得などのファイルシステムにアクセスする部分を作りこむ感じで進めています。ただ、ドメイン層のクラスは再利用性を考えPOCOなクラスで、TreeViewやListViewのItemはバインドする関係上INotifyPropertyChangedの実装である必要があります。内容的には、ほぼ同じクラスをソリューション内に2つあると、ちょっと嫌な感じがしますが必要なのでそのまま進めます。
2つのオブジェクトを変換するコンバーターを作る必要がありますが、相互変換は必要なさそうなので、ViewModel側でドメイン側のオブジェクトをコンストラクタ引数にして生成するようにしてみました。

DDDは良く理解できていないのですが、ファイルシステムを扱う部分はViewModelからインフラ層に逃がして、インフラ層でつかうクラスはドメイン層で定義してといった感じの作業を行っています。

とりあえずクリックで動くようになって来たので、面白くはなってきたのですが、ここから先をどうするかが問題です。過去にこの段階で挫折したことが何回かあり、劣化版エクスプローラー+αと考えていますが、どのような機能を付与するかが悩みどころです。

とりあえず、画像ファイルのプレビューは、簡易的なコードで実装することが出来るので実装するとして、あとはファイルやフォルダのコメント機能を考えたいと思います。

SQLiteを扱うことに成りますが、ファイルやフォルダの一覧の取得に合わせてコメントがテーブルに有る場合、合わせて取得する必要があるので、ファイルシステムにアクセスしている既存のコードを見直す必要があります。

記事を書いていて、気が付きましたが、プレビューやコメントは非同期で処理する方法も考えられます。そうすれば既存のコードを変更するなく独立したコードで実現することが出来そうですね。

20250603
画像ファイルのプレビュー機能をつけてみました。

画像の読み込みや加工ルーチンをインフラ層に書こうと思ったら、普通のクラスライブラリでプロジェクトなのでBitmapSourceが扱えない。
プロジェクトをwpflibで作れば良いのか?ただ画像ファイルを扱うだけでプロジェクトを作成するのはいかがなものか?

本日は以上

コメント