次のようなアプリケーションを開発中です。
アプリケーション内で使用するデータ(CSVファイルなど)をアプリケーションで設けた特定
フォルダに収容する形で管理する方式を考えているのですが、
この方式によると、エクスプローラのアイコンドラッグ操作によって、アプリケーションをコピ
ーするときに、該当するデータを収容しているフォルダは取り残されます。
このコピーの取り残しは、コピー先が他のドライブ(Dドライブ、EPROM…)の場合、対応
不可能なものになります。
本アプリケーションのファイルデータと該当のフォルダを何らかの方法でリンクしておくのが、
最も、望ましいのですが、
最低限、ユーザがエクスプローラのドラッグ操作によって、本アプリケーションのファイルデー
タをコピーしようとするときに、ユーザに警告を出すことが必要だろうと考えています。
エクスプローラに特定アプリケ―ションの種別を登録しておき、その種別のアイコンがドラッグ
されたときに、アラームを含め、何らかの通知を出すようなインタフェースは用意されていない
のでしょうか。
いろいろ探しましたが、浅学にして見つけることができません。宜しく、ご教授のほど、お願い
いたします。
不可能ではないかと。
もちろん私もエクスプローラの全てを知っているわけではないですが、
(ごく一部しか知らないと書いた方が正確か)
私が知らないだけのそんな機能があるとも考えにくい。
データのサイズや性質(実行時に変更されるか等)にもよりますが、
実行ファイルそのものにデータを含めることは不可能ではないと思います。
ですが、それよりも仕様の再考をお薦めします。
# もしかしたら可能かもしれません。
# その場合は他の回答者の方が訂正してくれると思いますので、
# 数日は結論を待っても良いかも。
ファイルやフォルダの作成、削除、名前の変更などは
APIでキャッチできるので監視アプリを作って常駐させて
ご自身でアプリケーションとデータフォルダのリンクを
チェックすれば出来るかも。
http://msdn.microsoft.com/ja-jp/library/cc429231.aspx
http://nienie.com/~masapico/api_FindFirstChangeNotification.html
移動という事は
ファイル情報の削除、
ファイル情報の追加を監視すればいいのかな。
僕にはこれ以外の方法が思いつきませんでした。
最初の考え方に無理があると思います。
アプリケーションを勝手にエクスプローラーで移動するような操作に関しては
ユーザーが勝手にやった事なのでそこまで保証するのは無理な話です。
アプリ側で出来るとしたら、そのアプリケーションのインストールフォルダーの
配下にデータを管理するようにしてそのフォルダーごと移動してねと言うくらいかと。
もしくは引越し用の機能をアプリに持たせるかでしょう。
APIのフックまでしてやるべき事とも思えないし、
それをする為には監視するアプリを常駐させないといけなくなると思います。
特定のアプリのケアの為だけにソフトを常駐させるのはあまり歓迎されないと思いますよ。
内容的にも通常の運用でしょっちゅうするような操作とは思えませんし。
たいちうさま 金魚ちゃんさま PATIOさま
さっそくのご教授、ありがとうございます。
最初の質問が正確ではなかったようなので、念のため、実現したい仕様を書き直します。
2つのファイルデータ(正確にはファイルAとフォルダB)が関連付けられており、アプリで、
ファイルAを開いたときには、必ず、フォルダBを使用します。そのため、ファイルAを外部媒
体(CD,DVD、リムーバルメモリなど)に、移動するときに、フォルダBも一緒に移動する
ようにしたいということです。
皆さんおっしゃるように、たしかに、これを自動的におこなわせることは、元々、無理スジな感
があります。
また、PATIOさんが、私が「どうしても…」ということならばということで示唆されたアプ
リ内の引越し機能のいろいろ考えていたのですが、私の知恵の及ぶところでは、操作が二重複雑
になったりして、あまり、好ましいものではありませんでした。
そこで、最低限、次のような監視機能はないものかと願っているのですが。
(1) 監視機能にファイルAのアプリケーション種別を登録しておく
(2) ユーザがファイルAのアイコンのドラッグなどの移動操作を開始した場合、監視機能が
該当アイコンのアプリケーション種別を識別し、上記登録をおこなったアプリケーション種別で
あれば、アラームを発する。
(3) ユーザは、アラームを受け、フォルダBの移動をユーザ操作によっておこなう
おこなわれる頻度は少ない機能とは思いますが、ユーザからしてみれば、いつもどおりにアイ
コンのドラッグ移動を終え、これでOKと思っているところ、実際は、データの半分(ファルダ
B中のデータ)が移ってなかったということは、いくらマニュアルで注意しておこうとも実際に
は起こり得ることであり、それはユーザにかなりの痛手になると思い、操作中の警告ぐらいは何
とかしたいと苦悶しています。
まずは、金魚ちゃんさまが教えていただいた方法を検討してみたいと思います。
エクスプローラ以外にもコマンドプロンプトからファイル操作はできるので、
エクスプローラに特化してがんばってもあまり意味はないでしょう。
やるとしたら、
データフォルダにアクセスするプログラムはサービスとして作成し、
このサービスは全てのユーザで自動起動されるようにして、
フォルダへはプログラムのみがアクセスできるようにアクセス権限を
設定すればいいのかなぁ。。
そもそも、勝手に移動してしまう人に「移動しないように」と
徹底してもらうほうが早いと思います。
一般論として、APPのインストールされているフォルダに存在する
ファイル・フォルダ等はは勝手に移動されないという前提でほとんどのAPPは作成されて
います。
それを阻止するような機能を持つAPPは滅多にありません。
そういえば。
IEでWEBページを保存する際に「完全」を選んで
保存すると、htmlと「~~.files」というフォルダがリンクして
どちらかを名前を変更したりすると警告が出ますね。
私はやり方はわかりませんが、
このリンクさせる機能がもし使えば実現できるかもしれません。
俺も勝手にされることの防止には限界あると思うし
苦労の方がでかいから勧められないな。
以下は俺の想像であり
あなたの希望する機能ができるかどうかまでは知りません。
IEでWebページを保存するとhoge.htmファイルとhoge.filesディレクトリが作られる。
hoge.htmファイルを消すとhoge.filesディレクトリも消える。
hoge.htmファイルを移動するとhoge.filesディレクトリも移動する。
でも、hoge.filesディレクトリ内を消すなどはできてしまう。
マイドキュメントやデスクトップ、
圧縮ファイルのZIPファイルがディレクトリのように見える
などの仮想ディレクトリ。
そういうのを自分でも作ってしまうシェルエクステンション
ただ俺は手助けできないよ。
シェルエクステンションがバグればエクスプローラ(タスクバー込)が死ぬし
インストーラは必須だし
日本語での情報は少ないし。
Firefoxのソースをみるとか。
ソースのライセンスとかどうなっているのか知らないけどさ。
IEとはファイルの拡張子が違うから
Firefoxが独自にそういう機能を実装しているんじゃないかと思う。
IEで保存したファイルをDVDなどにコピーしたときディレクトリもコピーされるのかどう
かは確認したことないので俺知らない。
どのようなユーザを想定しているのでしょうか?特定のユーザ?
私がVector等でDLしたソフトが、そんな目的で常駐アプリを
埋め込んだとしたら、作者の良識を疑いますよ?
(その旨が分かりやすく書かれていたら、
良識ではなく、常識のみを疑います)
もし、あなたの顧客がそのような仕様を要求しているならば、
作れないことはないとしても、
・必要ないときもパソコンに負荷を掛け続ける
・アンチウィルスソフトに誤判定されるおそれがある
・アンチウィルスソフトに悪影響を及ぼすおそれがある
・Windows Updateによって、動作しなくなるおそれがある
などと説明し、データ保護のための、より現実的な方法を提案しては?
# 常駐アプリでの監視はさっきも考えたけど、
# APIのフックは思いつかなかったな。
# やったこともないし。
>そもそも、勝手に移動してしまう人に「移動しないように」と
>徹底してもらうほうが早いと思います。
同感。
>IEでWEBページを保存する際に「完全」を選んで
>保存すると、htmlと「~~.files」というフォルダがリンクして
>どちらかを名前を変更したりすると警告が出ますね。
エクスプローラが「~.html」と「~.files」だけ特別扱いしているかもね。
>ファイルAを開いたときには、必ず、フォルダBを使用します。そのため、ファイルA
を外部媒
>体(CD,DVD、リムーバルメモリなど)に、移動するときに、フォルダBも一緒に
移動する
>ようにしたいということです。
それなら開いたファイルAのパスを調べてフォルダBが同じ位置になければ
警告を出すようにすれば良いと思う。
例えば
aaa.csv(データファイル)
aaa.files(データフォルダ)
を関連付けてアプリが開くわけ。
bbb.csv(データファイル)
bbb.files(データフォルダ)
も関連付けてアプリが開く。
アプリがデータファイルを開いたときに
bbb.csv と同じパス位置に bbb.files がなければ警告を表示させる。
(例:データとフォルダ構造の対応が崩れています)
これだけで十分だと思います。
>まずは、金魚ちゃんさまが教えていただいた方法を検討してみたいと思います。
どうしても監視プログラムを作るならメモリ常駐量は1MB(数MB)以下にしましょう。
そうしないと僕は常駐ソフトを許せません。
(個人的に削除したくなるから)
ジャンクション機能を使って(コマンドラインだとlinkd.exe)
自アプリの場所にリンクを張っておいては?
エクスプローラのコピーでもリンクの中身がコピーされる(のかな?どういう
挙動かは未確認)と思うのでその辺はアプリ起動時にごにょごにょと・・・。
出来なかったらごめん
linkd.exeの使い方や入手方法などは
ジャンクション機能を使ってフォルダをマウントする
http://www.atmarkit.co.jp/fwin2k/win2ktips/991fjunction/fjunction.html
皆さん、ご親切にありがとうございました。
とりあえず、御礼申し上げます。
ご意見をうけての検討を進めます。
実装したことがないので実際できるかどうかはわからないけど
シェル拡張でいいならICopyHookというインターフェースがあります。