2010-01-16 448 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); 
    } 
}