2

Windows 7 でネットワーク ファイル システム用の Windows エクスプローラ シェル拡張機能を実装していますが、削除機能の実装中に問題が発生しました。

私のリモートファイルシステム階層が次のようになっているとしましょう:

Dir1
+-Dir2
| +-A
| +-B
+-C

私の理解では、実装する必要がありますがITransferSource::RemoveItem(私はこれを実行しました)、最初にファイルシステム ツリーの最も遠い子から再帰的に呼び出されることを期待していました (つまり、深さ優先の再帰トラバーサル):

(A, B, Dir2, C, Dir1)

何が起こるかというと、最初にルートが呼び出され、次に各子が繰り返し呼び出されます。

(Dir1, C, Dir2, A, B)

操作の進行状況バー (「項目の検出」ダイアログ) を表示するために、シェルは削除するすべての項目を再帰的に反復処理するため、これは私にとっては少し奇妙です。私のリモート ファイル システムは、空でないディレクトリの削除をサポートしていません。私の知る限り、Windows のローカル ファイル システムにも同じ制限があります。反復順序の変更に関する MSDN のヒントは見つかりませんでした。

実際の反復順序は、ファイルシステム内のアイテムの作成順序によって異なると思います。

このインターフェイス メソッドを実装するCOPYENGINE_S_DONT_PROCESS_CHILDREN場合、自分でツリー全体を再帰して削除すると元に戻すことができますが、これではユーザーが進行中の削除をキャンセルすることはできないと思います (標準の Explorer シェルのように)。これは次善の解決策だと思いますが、より良い解決策が見つからない場合は、そうする必要があるかもしれません.

私が最初に考えたのは、空でないディレクトリの削除要求を後でキューに入れることでしたが、ディレクトリのすべての子の削除操作がいつ完了したかを拡張機能が認識できないため、これは機能しないと思います。これらのアイテムを「後で」削除するためのスレッドを生成することもできますが、その場合、原因不明の奇妙な動作やクラッシュが発生することはほぼ確実です。

それで、私の質問は、Windows 7 シェル拡張で削除操作を実装する適切な方法は何ですか?

PS: おそらくおわかりのように、Windows シェル拡張機能は私にとってまったく新しいトピックなので、質問が不完全な場合は事前にお詫び申し上げます。必要に応じて質問を絞り込みます。

ありがとう!

4

1 に答える 1

1

ドキュメントから、EnterFolderメソッドとLeaveFolderメソッドが役立つよう見えます

于 2011-10-03T17:42:48.790 に答える