代码之家  ›  专栏  ›  技术社区  ›  friederbluemle

在C中将文件剪切到剪贴板#

  •  11
  • friederbluemle  · 技术社区  · 16 年前

    我正在寻找一种以编程方式将文件剪切到剪贴板的方法,例如,调用c中的某个函数,这与在 Windows Explorer 压榨 Ctrl键 + X .

    运行程序并按 Ctrl键 + V 在硬盘上的其他文件夹中,原始文件将是 感动 到新文件夹。通过查看堆栈溢出问题 Copy files to clipboard in C# ,我知道做复印工作很容易,但切割似乎工作不同。我该怎么做?

    3 回复  |  直到 8 年前
        1
  •  17
  •   Peter Mortensen Pieter Jan Bonestroo    12 年前

    请尝试以下内容,翻译自 The Code Project 文章 Setting the Clipboard File DropList with DropEffect in 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
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    12 年前

    为了看看会发生什么,我把 MemoryStream 用一个 DragDropEffects 这样地:

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

    显然,这是一个真正的削减,而不是一个副本!(这是在Windows7上—我没有尝试过其他操作系统)。不幸的是,这只是巧合。例如,

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

    不产生副本(仍然是剪切)。似乎非空值导致剪切,空值导致复制。

        3
  •  0
  •   Ronnie Overby    8 年前

    我喜欢把这样的代码包装在一个有意义的api中。我也喜欢尽量避免使用神奇的字节字符串。

    我想出了一种扩展方法,它可以有效地利用 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);
        }
    }