Как программно вырезать / копировать / получать файлы в / из буфера обмена Windows в стандартной системной форме? - PullRequest
4 голосов
/ 23 мая 2010
  1. Как поместить ссылку на вырезание / копирование определенных файлов и / или папок в буфер обмена Windows, чтобы при открытии стандартного окна проводника Windows перейти куда-нибудь и нажать Ctrl + V - файлы вставлены?

  2. Если я копирую или вырезал некоторые файлы / папки в Windows Explorer, как мне получить эту информацию (полные имена и были ли они вырезаны или скопированы) в моей программе?

Я программирую на C # 4.0 , но интересно узнать и о других языках.

Ответы [ 3 ]

4 голосов
/ 23 мая 2010

У меня есть решение на 90%, переработанное из форматов буфера обмена, и мой ответ в этой теме . Вам нужно будет установить две части данных буфера обмена. Список файлов, это легко сделать. И еще один формат буфера обмена с именем «Preferred Dropeffect», который указывает, запрашивается ли копия или перемещение файлов. Ведущие к этому коду:

    public static void StartCopyFiles(IList<string> files, bool copy) {
        var obj = new DataObject();
        // File list first
        var coll = new System.Collections.Specialized.StringCollection();
        coll.AddRange(files.ToArray());
        obj.SetFileDropList(coll);
        // Then the operation
        var strm = new System.IO.MemoryStream();
        strm.WriteByte(copy ? (byte)DragDropEffects.Copy : (byte)DragDropEffects.Move);
        obj.SetData("Preferred Dropeffect", strm);
        Clipboard.SetDataObject(obj);
    }

Пример использования:

        var files = new List<string>() { @"c:\temp\test1.txt", @"c:\temp\test2.txt" };
        StartCopyFiles(files, true);

Нажатие Ctrl + V в проводнике Windows скопировало файлы из моего каталога c: \ temp.

То, что я не смог получить, это операция «вырезать», передача false в StartCopyFiles () произвела операцию копирования, исходные файлы которой не были удалены из исходного каталога. Не знаю почему, должно было сработать. Я считаю, что фактический формат потока «Preferred DropEffects» более изящен, возможно, с участием печально известных PIDL.

1 голос
/ 10 января 2014

Посмотрите на этот ответ , который описывает рабочую операцию вырезания. (Измените 2 на 5 для операции копирования.)

1 голос
/ 23 мая 2010

Если вы используете Windows Forms , посмотрите на System.Windows.Forms.Clipboard . Я думаю, что должно быть в состоянии сделать это. Я не уверен, как делать то, что вы хотите, поскольку я никогда не обращал на это внимания, но сначала я посмотрю на методы FileDropList ( GetFileDropList и т. Д.), Поскольку они выглядят многообещающими.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...