そうかAppDataに保存するようにしないとな

一応、汎用的に使える様にフォルダー監視ツールが完成したので左のDownloadからダウンロード可能です。

ただ、なんか野良アプリなので色々とダウンロードの制限にひっかかってしまうが何も仕込んでないのでご安心ください。

インストールして初回起動はこのダイアログが表示されますが、設定を保存すると次回からはパソコンを再起動すると自動的にタスクトレイに常駐する様にしています。

但し、複数起動のチェックを入れてないのでデスクトップにショートカットを置いて、それで起動するといくつも常駐してしまうのでご注意を(この辺りは後で対応予定)

監視ファイル設定は「*.csv」とか1つの拡張子しか対応していません(今の所)

Windowsのシステムイベントを取得したときに動作するので、監視時間などの設定はありません。

常に監視、若しくは監視しないのどちらかと言うことになります。

このツールの目的は単に車検証閲覧アプリのダウンロードファイルを共有フォルダーにコピーする事が目的で作成しました。

なんでも複数のPCで車検証を閲覧してcsvをダウンロードしてシステムにインポートしてもらっているのですが、個別のPCにダウンロードされるのですが、ダウンロード先を変更できません。(これは天下の国交省が作成したアプリの仕様)

なので、ダウンロード後別のPCでインポートしたい場合は共有フォルダーに手動でコピーして下さいねと言う指導をしたものの面倒臭いとのことで、このツールを用意したということです。

その際、自作する前にどこかの俺と同じ様な感じの人が仮にいたとしたら作って公開しているんじゃないかとか期待してフォルダー監視ツールをあさったのですが、まぁ結構大事な仕様で複雑な物が多すぎてユーザが混乱しそうだなぁと思って辞めました。

中でも、Windowsのシステムイベントを拾わず、時間を決めて巡回するタイプの物が多く、これも試して見たのですが、非力なPCでRAMが4GBとかで動いているPCなんかだとPCそのものが動作し無くなってしまい、削除するのに非常に手間取ってしまうほど上手に作ってないのが多かった印象。

監視時間も1分とか5分とか分単位にしないと重たくなるなどと注意書きがある始末で、大体秒でやってもらわないと間に合わないので1秒とかで設定すると全く動かなくなってしまいました。

これではとてもユーザに勧められないので、Androidアプリの開発の時なんかはIntentを投げたり受けたりとシステムからのイベントをフックして作るわけですが、当然Winodwsでもその仕組みは持っているので、そのシステムイベントに反応する、システムイベントを取得出来るアプリを用意すれば、ファイルがダウンロードされた時にのみ動作するアプリが作成出来るのでこれならクライアントには負担が無く普通にダウンロード後にコピーする処理をいれれば良いだけになります。

但し、注意が必要で、ダウンロードのイベント(File Createイベント)を拾った直後はファイルがロックされた状態になるのでイベント処理の中で連続でコピー処理を入れてしまうと他のプロセスで開いています見たいな例外がスローされてしまうので、フリー状態になるまでちょっとだけ待機と言うかここはループでフリーになるまで回して一応、失敗も想定して無限ループにならない様にして処理すると、気持ち良くコピーができる様になると言う訳です。

もう一つの注意としては、ファイル系のイベントを1つのオブジェクトに全部登録してSwitch等で分岐処理したくなるのですが、それをやると痛い目に遭います。

ファイルが作成されたかどうかだけが必要なのでCreateイベントのみで処理する様にしないと、Createの後、Updateイベント(更新イベント)が複数回飛んで来ます。

これは、ファイル作成後、最終アクセス日やらなにやらファイルに関する処理が走るのでその度にUpdateイベントが飛んでくるのでこれを無視しないとややこしくなります。

ロックされたファイルが解除されたとかそういうファイルに関する後処理もイベントに絡んでくるので、ここはCreateイベントのみのメソッドを作成してリネームとか削除とかそういうイベントも監視したいと言う場合は別途オブジェクトを作ってそっちで別に処理しないとコピーしようと思ったら別のイベントが走ってとか、想定通りの処理が走らず面倒です。

それと、ダウンロード想定なので、手動でどこかのフォルダーから複数のファイルを一気に監視フォルダーに放り込んでしまうと対象のファイルが複数あっても、バッファ処理をいれてないのでコピーされないファイルが出てくきます。

まだ実装してませんが、その場合はファイルをバッファにキューして処理を回すというロジックが必要なので、後で追加しようかなぁとは思っているところですが、仕事としては必要無い処理だったので今のバージョンには実装してません。

後は、昭和エンジニアのオッサンPGはiniファイルを好んで使うのですが、プログラム起動フォルダーに保存しようとしてしまい、下手こいてしまいました。

仕事ではサーバーの任意のフォルダーにアプリを置いてアプリケーションサーバーとして共有exeとして動作させているのですが、その場合任意フォルダーなので特に保存の制限が無いのでiniファイルもアプリケーションの起動フォルダーに設定してしまいがちですが、今回、ユーザに全部設定してもらう様にとインストーラーを作って提供したので、Program Filesにインストールする様にしています。

この場合、アプリケーション起動フォルダーにiniファイルを保存しようとすると失敗するわけです。

開発中は、binフォルダーで動作するので意識しないのですが、インストール後、何故か思った様に動作しないと思ったらそういう事かとつい、忘れがちな事を思い出しました。

で、Program Filesフォルダーに無理矢理iniファイルを作成する事も出来ますが、トレンドとしてAppDataフォルダーに企業名とアプリ名のフォルダーを作ってそこに動的データ関係を保存すると言うのが慣習の様なのでそれに準じる事にして、先程修正したのをアップロード済です。

AppDataフォルダーはユーザのルートから辿っていくフォルダーで大抵のアプリはここに色々とデータを保存しているのでその慣習に従ったと言う事です。

無理矢理Program Filesに保存する場合は、UAC絡みの権限やら色々と設定しないと出来ないのでメンテナンスがしんどいし別にアプリの起動フォルダーに無くても設定が保存出来ればいいのでAppDataを使った方が良いだろうね。

こう言うのGIT Hubにでも公開しようかなぁと思ったので、そのうちGIT Hubに上げる予定

ソースはGITHUBに公開しているのでお好きにダウンロードして改造して使って見て下さい。

役に立て場だけど...(無料)

コメント