2009-07-07 2 views
4

私はTreeViewを持つWinFormsアプリケーションを持っています。ユーザーはWindowsExplorerからTreeViewにファイルをドラッグすることができます。その後、ファイルをWindowsExplorerにドラッグすると、ファイルが削除された場所にファイルがコピーされます。私がしようとしているのは、ファイルが削除されているディレクトリにファイルがすでに存在する場合、コピーするファイル/フォルダの名前を事前にコピーして、衝突がないようにしたいということです。ファイルがWindowsエクスプローラにドロップされると、どのように検出できますか?

ファイルをWindowsExplorerにコピーする方法は次のとおりです。 treeViewのItemDragで、選択したノードのノードをループし、それを配列にパッケージ化します。その後、私はこのコードを使用します。

 var dataObject = new DataObject(DataFormats.FileDrop, files.ToArray()); 
     dataObject.SetData(DataFormats.StringFormat, dataObject); 
     DoDragDrop(dataObject, DragDropEffects.Copy); 

これはうまく動作しますが、Windowsのエクスプローラにオフで発送後は、それは私の手からです。どのようにファイルがコピーされるのか、いつどこでコピーされて変更されるのかを見つけることができますか?これは可能ですか?

+0

これを行うには、この記事(http://www.codeproject.com/KB/shell/explorerdragdrop.aspx)を参照してください。それは助けるかもしれない。 – Kirtan

答えて

1

Explorer Drag & Dropは、達成しようとしていることを行う優れた記事です。

EDIT2:CodeProjectに同じC++ articleがあるようです。しかし、私はC#を使用してそれを行う方法の方法を見つけることができませんでした。

+0

それは私が持っている主な問題をカバーしていません。彼の例のリストボックスからエクスプローラにドラッグしようとすると、通常のようにウィンドウが表示されます。私はそれを避け、自動的にファイルの名前を変更したい。 – BFree

0

私はそれが可能ではないと思います。

0

AFAIK、ドロップターゲット(あなたの場合は宛先フォルダ)を知る方法はありません。 CFSTR_FILENAMEMAPシェルのクリップボード形式を調べることはできますが、この場合でもドラッグアンドドロップの前(または処理中)にのみ名前マッピングを提供できます。

また、.netのデフォルトのDataObjectにはシェルのサポートが限られていることにも注意してください。だからあなたが上記のフォーマットを使用する必要がある場合は、独自のIDataObjectの実装を書く必要があります(または、誰かの実装を取る、ロットシェルドラッグアンドドロップ関連の良い例を取る必要がありますhere

0

ユニークで簡単に区別できる名前のテンポラリファイルを作成し、代わりにそのファイル名をデータオブジェクトのドロップリストに入れます(そのファイルは空であるか、必要な情報が含まれている可能性があります)。ドロップを検出するには、FileSystemWatcher(ドライブ全体を監視)を使用します(フィルタを一時ファイル名に設定し、IncludeSubDirectoriesをtrueに設定し、Pathをドライブのルートディレクトリに設定して監視します)。DoDragDropを開始します。一意の/簡単に区別できるファイルが削除されたら、FileSystemWatcherはどこにドロップされたのかを伝えることができ、必要な作業を実行することができます(例えば、ドロップされた一時ファイルを削除し、元々削除したいファイルで置き換えます。誰かにもっと良いファイルを提示するアイデアを与えるかもしれません!)

一つの欠点は、誰かがファイルを落とす可能性があることを本当に知らないということです。いくつかのドライブ用のウォッチャーをセットアップする必要があります。ドライブ(またはネットワークパス)が見つからない場合は、問題が発生します。落とした後にウォッチャーを処分することを忘れないでください。

しかし、よりよい方法が必要です。例えばzipフォルダからファイルをドラッグするときに考慮してください。ファイルはドロップ後にのみ抽出されます。

関連する問題