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

时间:2010-01-16 16:04:50

标签: c# .net file clipboard

我正在寻找一种以编程方式将文件剪切到剪贴板的方法,例如,有些人调用C#中的函数,就像在Windows Explorer中选择文件并按 Ctrl一样 + X

运行程序并在硬盘驱动器上的某个其他文件夹中按 Ctrl + V 后,原始文件将 移动 到新文件夹。通过查看Stack Overflow问题 Copy files to clipboard in C# ,我知道复制工作很容易,但切割似乎有所不同。我怎么能这样做?

3 个答案:

答案 0 :(得分:17)

请尝试以下内容,翻译自 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);

答案 1 :(得分:2)

为了看看会发生什么,我将MemoryStream替换为DragDropEffects,如下所示:

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

显然,它可以作为真正的剪辑而不是副本! (这是在Windows 7上 - 我没有尝试过其他操作系统)。不幸的是,它只是巧合。例如,

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

不会产生副本(仍然是剪辑)。似乎非null会导致剪切,副本为null。

答案 2 :(得分:1)

我喜欢将这样的代码包装在一个有意义的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);
    }
}