Расширение оболочки Windows Explorer: рекурсивное удаление через ITransferSource::RemoveItem?
Я внедряю расширение оболочки Windows Explorer для сетевой файловой системы в 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 Shell - это совершенно новая тема для меня, поэтому я заранее прошу прощения, если вопрос не завершен; Я уточню свой вопрос по мере необходимости.
Спасибо!
1 ответ
Из документации видно, что методы EnterFolder и LeaveFolder помогут вам.