Расширение оболочки Windows Explorer: рекурсивное удаление через ITransferSource :: RemoveItem? - PullRequest
2 голосов
/ 30 сентября 2011

Я использую расширение Windows Explorer Shell для сетевой файловой системы в Windows 7, и я столкнулся с проблемой при реализации функции удаления.

Допустим, моя иерархия удаленной файловой системы выглядит следующим образом:

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 являются для меня совершенно новой темой, поэтому я заранее прошу прощения, если вопрос не завершен;Я уточню свой вопрос по мере необходимости.

Спасибо!

1 Ответ

1 голос
/ 03 октября 2011

Из документации видно, что методы EnterFolder и LeaveFolder помогут вам.

...