Как Вы копируете произвольные данные в буфер обмена как файл?

Вы можете использовать простую DSL для загрузки файла kohttp (начиная с версии 0.8.0)

val response = upload {
    url( your destination url )
    file( file or file uri )
}

или функцию расширения

val response = file.upload (строка назначения или URL)

10
задан Peter Mortensen 21 September 2015 в 19:46
поделиться

4 ответа

Я бы сказал, что проводник сам выполняет копирование в файлы назначения, поэтому нет возможности напрямую записать место назначения файлы. Это имеет смысл, поскольку имена исходных файлов могут поступать только из приложения, которое скопировало данные в буфер обмена, который не должен быть проводником. OTOH имена файлов назначения могут фактически отличаться, потому что файлы с тем же именем могут уже существовать в папке назначения, и только проводник может создавать измененные имена для файлов назначения (например, добавляя «Copy of» или добавляя »( 2) "к базовому имени файла).

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

Вы можете попытаться выполнить процесс как можно легче, хотя. Обычно, когда пользователь копирует данные в буфер обмена, они немедленно помещаются туда, независимо от того, будут ли они использоваться для операции вставки. Для вашего приложения это будет означать, что вам нужно будет каждый раз создавать файлы и помещать список имен файлов в буфер обмена. Тем не менее, Windows поддерживает режим с именем Delayed Rendering , который используется именно для таких случаев. По сути, вы помещаете только пустую заглушку данных в буфер обмена, и только когда другое приложение попытается получить доступ к данным, оно будет запрошено вашим приложением. Таким образом, вы можете реализовать это так, что только когда пользователь попытается вставить файлы в проводник, вы сохраните их на диск и вернете список имен файлов.

5
ответ дан 3 December 2019 в 16:10
поделиться

I've never tried it but I think it is indeed possible. Please take a look at the MSDN Documentation for Shell Clipboard Formats. CFSTR_FILECONTENTS and CFSTR_FILEDESCRIPTOR are the formats you are likely supposed to handle.

Additionally, I found an article at Code Project which provides a demo program: How to drag a virtual file from your app into Windows Explorer.

Update: An example written in .NET:

13
ответ дан 3 December 2019 в 16:10
поделиться

Из статьи MSDN Обработка сценариев передачи данных оболочки

  • Существующие файлы должны предлагаться в формате CF_HDROP .
  • Предложить файловые данные с помощью CFSTR_FILECONTENTS / CFSTR_FILEDESCRIPTOR форматы. Такой подход позволяет цель создать файл из данных объект без необходимости знать что-нибудь о базовых данных место хранения. Вы должны нормально представить данные как интерфейс IStream. Эта механизм передачи данных больше гибкий, чем глобальный объект памяти и использует гораздо меньше памяти.

Две другие хорошие статьи для чтения из MSDN:

Когда я впервые начал работать с буфером обмена для передачи файлов, я распечатал все три статьи и прочитайте их несколько раз.

Работа с интерфейсами может быть довольно сложной. Я нашел две хорошие библиотеки, чтобы помочь с этим.

Drag and Drop Component Suite для Delphi . Если вы прокрутите вниз на главной странице, вы увидите, что некоторые часто задаваемые вопросы хорошо читаются. Есть также много примеров приложений с загрузкой. Я думаю, что демонстрации AsyncSource должны быть полезны для того, что вы ищете. Пакет бесплатен с источником. Код, кажется, хорошо прокомментирован.

В настоящее время я использую Transfer @ Once компонент из Квазидата. Это не бесплатно, но очень недорого. Изначально я использовал Transfer @ Once, потому что в то время он был лучше поддержан, чем набор компонентов Drag and Drop. Однако эта ситуация изменилась. Transfer @ Once еще не поддерживает Delphi 2009. Когда я перейду к перемещению своего приложения, я, вероятно, переключу компоненты. Код Transfer @ Once включен в стоимость покупки. Лично я обнаружил, что код Drag and Drop гораздо проще читать и отслеживать.

7
ответ дан 3 December 2019 в 16:10
поделиться

Прошло много времени с тех пор, как я играл с копией / вставкой, но я уверен, что вы можете делать то, что вы повторяю (вставьте блоб как новый файл в буфер обмена).

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

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

[Редактировать] Посмотрите документацию wxWidgets по перетаскиванию . Именно с этим я и работал, и он дает некоторые подсказки о типах данных.

Что вы пишете? Delphi?

[Edit2] Я думаю, что это может быть ограничением Windows (?). Это может быть просто документация по wxWidgets, но есть предложение, что вы копируете только имена файлов, а не сами файлы . Если это так, сначала вам нужно будет использовать исходное предложение о создании временного файла: - (

1
ответ дан 3 December 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: