2009-07-07 3 views
4

У меня есть приложение WinForms с TreeView. Пользователь может перетаскивать файлы из WindowsExplorer в TreeView, а затем они могут перетаскивать файлы обратно в WindowsExplorer, что влияет на копии файлов в любом месте, где были удалены файлы. То, что я пытаюсь сделать, - если файлы уже существуют в каталоге, где файлы удаляются, я хочу переименовать файлы/папки, скопированные заблаговременно, чтобы не было столкновения.Как вы можете обнаружить, когда файлы удаляются в Проводнике Windows?

Вот как я копирую файлы в WindowsExplorer. В ItemDrag treeView я прохожу через узлы выбранного узла, а затем упаковываю его в массив. Затем я использую этот код:

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

Это хорошо работает, но как только корабли прочь к Windows Explorer, это из моих рук. Как узнать, когда и где файлы копируются TO, и перехватывать их для внесения изменений? Это возможно?

+0

Вы хотите проверить эту статью - http://www.codeproject.com/KB/shell/explorerdragdrop.aspx - для использования на C++. Это может помочь. – Kirtan

ответ

1

Explorer Drag & Drop - отличная статья, делающая то, что вы пытаетесь достичь.

EDIT2: Кажется, что имеется код C++ article, доступный для него в CodeProject. Но я не смог найти способ, как это сделать, используя C#.

+0

Это не касается основной проблемы, с которой я сталкиваюсь. Если вы попытаетесь перетащить из списка в свой пример обратно в проводник, вы получите подсказку по окнам, как обычно. Я хочу избежать этого и автоматически переименовывать файлы. – BFree

0

AFAIK, нет способа узнать цель передачи (в папке назначения вашего случая). Вы можете посмотреть в формате CFSTR_FILENAMEMAP shell clipboard, но в этом случае вы можете предоставлять только сопоставления имен перед (или в процессе) drag-n-drop.

Также обратите внимание, что по умолчанию DataObject в .net имеет ограниченную поддержку оболочки. Поэтому, если вам нужно использовать упомянутый выше формат, вам нужно написать свою собственную реализацию IDataObject (или взять чью-то реализацию, хороший пример с материалами, связанными с перетаскиванием в лоток, можно найти here)

0

Вместо того, чтобы помещать файл имена в объект данных, создайте временный файл с уникальным/легко различимым именем и вместо этого поместите это имя в список данных объекта данных (этот файл может быть пустым или содержать некоторую информацию, которая вам может понадобиться). Используйте FileSystemWatcher (просмотр всего диска), чтобы обнаружить падение (установите фильтр во временное имя файла, установите IncludeSubDirectories в значение true и установите путь к корневому каталогу диска для просмотра.) Инициируйте DoDragDrop. После удаления уникального/легко различимого файла FileSystemWatcher может сообщить вам, где он был удален, и вы можете делать все, что вам нужно (например, удалить удаленный временный файл и заменить на те, которые вы изначально хотели удалить. от идеального решения, но может помочь. Лучше еще, это может дать кому-то идею придумать лучший!)

Один недостаток заключается в том, что вы действительно не знаете, на каком диске кто-то может сбросить файл и вам может потребоваться настроить наблюдателя для нескольких дисков. И если вы пропустите диск (или сетевой путь), тогда проблемы .....! Не забывайте избавляться от наблюдателей после падения.

Должен быть лучший способ. например при перетаскивании файла из папки zip. Файл извлекается только после капли.

Смежные вопросы