我正在寻找一种以编程方式将文件剪切到剪贴板的方法,例如在C#中调用某个函数来执行与在Windows资源管理器中选择文件并按Ctrl + X相同的操作。
运行程序后,在硬盘驱动器上的其他文件夹中按下Ctrl + V后,原始文件将移动到新文件夹中。从Stack Overflow问题Copy files to clipboard in C#中可以了解到复制工作很容易完成,但是剪切似乎有所不同。我该怎么做?
我正在寻找一种以编程方式将文件剪切到剪贴板的方法,例如在C#中调用某个函数来执行与在Windows资源管理器中选择文件并按Ctrl + X相同的操作。
运行程序后,在硬盘驱动器上的其他文件夹中按下Ctrl + V后,原始文件将移动到新文件夹中。从Stack Overflow问题Copy files to clipboard in C#中可以了解到复制工作很容易完成,但是剪切似乎有所不同。我该怎么做?
请尝试以下操作,这是从The Code Project的文章在VB.NET中使用DropEffect设置剪贴板文件拖放列表中翻译而来:
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);
我喜欢将代码包装在有意义的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);
}
}
只是为了看看会发生什么,我把 MemoryStream 替换成了 DragDropEffects,像这样:
data.SetData("FileDrop", files);
data.SetData("Preferred DropEffect", DragDropEffects.Move);
显然,它作为一个真正的剪切而不是复制工作!(这是在Windows 7上 - 我没有尝试其他操作系统)。不幸的是,它只是巧合。例如,
data.SetData("Preferred DropEffect", DragDropEffects.Copy);
不产生副本,仍是一个剪切。似乎非空值会导致剪切,null 值则会产生复制。
Clipboard.SetFileDropList
,但它一直抛出异常,而你的方法却非常好用! - Emanuel Vintilă