Вырезать файлы в буфер обмена в C # - PullRequest
11 голосов
/ 16 января 2010

Я ищу способ программно вырезать файл в буфер обмена, например, какой-нибудь вызов функции в C #, которая делает то же самое, что и выбор файла в Windows Explorer и нажатие Ctrl + X .

После запуска программы и нажатия Ctrl + V в другой папке на жестком диске, исходный файл будет перемещен в новую папку. Глядя на вопрос переполнения стека Копировать файлы в буфер обмена в C # , я знаю, что выполнить копирование легко, но резка, кажется, работает иначе. Как я могу это сделать?

Ответы [ 3 ]

17 голосов
/ 16 января 2010

Пожалуйста, попробуйте следующее, переведенное с Код проекта статья Настройка DropList файла буфера обмена с DropEffect в VB.NET :

byte[] moveEffect = new byte[] {2, 0, 0, 0};
MemoryStream dropEffect = new MemoryStream();
dropEffect.Write(moveEffect, 0, moveEffect.Length);

DataObject data = new DataObject();
data.SetFileDropList(files);
data.SetData("Preferred DropEffect", dropEffect);

Clipboard.Clear();
Clipboard.SetDataObject(data, true);
2 голосов
/ 11 апреля 2013

Просто чтобы посмотреть, что происходит, я заменил MemoryStream на DragDropEffects , например:

data.SetData("FileDrop", files);
data.SetData("Preferred DropEffect", DragDropEffects.Move);

По-видимому, он работает как подлинный вырез, а не как копия! (Это было на Windows 7 - я не пробовал другие операционные системы). К сожалению, это работает только случайно. Например,

data.SetData("Preferred DropEffect", DragDropEffects.Copy);

не дает копии (по-прежнему вырезано). Кажется, что ненулевое значение вызывает разрез, нулевое - копирование.

1 голос
/ 06 марта 2018

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

Я придумал этот метод расширения, который решает загадку, с которой @Keith столкнулся в своем ответе, эффективно используя перечисление DragDropEffects.

public static class Extensions
{
    public static void PutFilesOnClipboard(this IEnumerable<FileSystemInfo> filesAndFolders, bool moveFilesOnPaste = false)
    {
        var dropEffect = moveFilesOnPaste ? DragDropEffects.Move : DragDropEffects.Copy;

        var droplist = new StringCollection();
        droplist.AddRange(filesAndFolders.Select(x=>x.FullName).ToArray());     

        var data = new DataObject();
        data.SetFileDropList(droplist);
        data.SetData("Preferred Dropeffect", new MemoryStream(BitConverter.GetBytes((int)dropEffect)));
        Clipboard.SetDataObject(data);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...