Скопировать файлы в буфер обмена в С#

У меня есть Windows Forms TreeView ( node, подузлы). Каждый node содержит некоторую дополнительную информацию в своем теге. Кроме того, каждый узел отображает файл на диске. Самый простой способ скопировать/вырезать/вставить узлы/файлы в С#?

Было бы неплохо иметь пример кода.

Ответ 1

Рассмотрите возможность использования класса буфера обмена. Он содержит все методы, необходимые для размещения данных в буфере обмена Windows и для извлечения данных из буфера обмена Windows.

StringCollection paths = new StringCollection();
paths.Add("f:\\temp\\test.txt");
paths.Add("f:\\temp\\test2.txt");
Clipboard.SetFileDropList(paths);

В приведенном выше коде будут помещены файлы test.txt и test2.txt для копирования в буфер обмена Windows. После выполнения кода вы можете перейти к любой папке и вставить (Ctrl + V) файлы. Это эквивалентно выбору обоих файлов в проводнике Windows и выборе копирования (Ctrl + C).

Ответ 2

Если вы только копируете и вставляете в свое приложение, вы можете сопоставить операцию вырезания/копирования вашего дерева с методом, который просто клонирует выбранный вами node. То есть:

TreeNode selectedNode;
TreeNode copiedNode;

selectedNode = yourTreeview.SelectedNode;

if (selectedNode != null)
{
    copiedNode = selectedNode.Clone;
}

// Then you can do whatever you like with copiedNode elsewhere in your app.

Если вы хотите иметь возможность вставлять в другие приложения, вам придется использовать буфер обмена. Вы можете получить немного больше, чем просто текст, узнав больше об интерфейсе IDataObject. Я не могу вспомнить источник, но здесь что-то имею в своих заметках:

При реализации в классе Методы IDataObject позволяют пользователю хранить данные в нескольких форматах в экземпляр класса. Хранение данных в более одного формата вероятность того, что целевое приложение, чьи требования к формату вы могли бы не знаю, может получить сохраненный данные. Сохранение данных в экземпляре IDataObject, вызовите метод SetData и укажите формат данных в формат. Установите autoConvert параметр false, если вы не хотите сохраненные данные для преобразования в другой формат, когда он извлекается. взывать SetData несколько раз в одном экземпляре IDataObject для хранения данных в более чем один формат.

После того, как вы заполнили объект, который реализует IDataObject (например, что-то называемое yourTreeNodeDataObject), вы можете позвонить:

Clipboard.SetDataObjecT(yourTreeNodeDataObject);