2010-01-16 207 views
11

我正在寻找一种方法以编程下调一档至剪贴板,例如,一些呼吁在C#中的函数,做同样的作为Windows Explorer选择一个文件,然后按Ctrl键 + X剪切文件在C#中剪贴板

运行程序,按下Ctrl键+V在硬盘上的其他文件夹后,原来的文件将是移动到新文件夹。通过查看堆栈溢出问题Copy files to clipboard in C#,我知道这是很容易做到的复印作业,但切割似乎工作不同。我怎样才能做到这一点?

回答

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

是的,我确实意味着 “数据”。 –

+0

完美的作品,谢谢! :) – friederbluemle

+0

谢谢,我试图用'Clipboard.SetFileDropList'并且它抛出一个异常,而是你的方法就像一个魅力! –

2

只是为了看看会发生什么,我有一个DragDropEffects这样取代了MemoryStream

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

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

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

不会产生副本(仍是剪切)。看起来非空导致切割,空副本。

+0

看我的答案,它使用DragDropEffects枚举。 –

0

我想换这样的代码是有道理的的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); 
    } 
}