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

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

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

请尝试下面的代码项目文章在VB.NET中使用DropEffect设置剪贴板文件DropList

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); 

只是为了看看会发生什么,我用这样的DragDropEffects替换了MemoryStream :

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

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

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

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

我喜欢在有意义的API中包装这样的代码。 我也想尽可能避免使用魔法字符串。

我想出了这个扩展方法,它有效地使用了DragDropEffects枚举,解决了@Keith在他的回答中所面临的谜团。

 public static class Extensions { public static void PutFilesOnClipboard(this IEnumerable 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); } }