Можно ли создать папку с помощью перетаскивания CFSTR_FILEDESCRIPTOR? - PullRequest
0 голосов
/ 02 мая 2019

У меня есть рабочая реализация для перетаскивания с использованием CFSTR_FILEDESCRIPTOR и CFSTR_FILECONTENTS, основанная на серии «Что за перетаскивание» из блога Raymond Chens:

https://devblogs.microsoft.com/oldnewthing/tag/what-a-drag

Itотлично работает для вставки одного или нескольких несуществующих файлов в любое окно проводника.

Следующее, чего я хотел бы добиться, это вставить целое дерево файлов, например, два файла и папку, содержащую другой файл..

Возможно ли это в формате буфера обмена CFSTR_FILEDESCRIPTOR?Если нет, есть ли альтернатива?

Может быть, что-то со средним форматом TYMED_ISTORAGE?(Текущее решение просто использует TYMED_HGLOBAL.)

Конечно, я мог бы создать временную папку где-нибудь и создать там свое дерево каталогов.Я также должен был бы убрать эту временную папку тогда, которая кажется хакерской.(Я думаю, это то, что делает 7-Zip.)

1 Ответ

0 голосов
/ 02 мая 2019

Как писал Денис, можно создать пустую папку, передав FILE_ATTRIBUTE_DIRECTORY в dwFileAttributes (когда FD_ATTRIBUTES установлена ​​в dwFlags).

Когда вам не нужны пустые каталоги, есть еще более простой способ получить папки. Просто включите относительный путь в элемент cFileName.

Например, если Filedescriptor содержит:

  • foo\bar
  • foo\baz

Исследователь создаст папку foo с двумя файлами в ней.

У этого решения есть один недостаток: член cFileName может иметь длину до PATH_MAX - 1 символов, поэтому это не будет работать для глубоко вложенных структур или структур с длинными именами файлов.

...