2010-01-16 8 views
11

Ich bin auf der Suche nach einer Möglichkeit zum programmgesteuerten Ausschneiden einer Datei in die Zwischenablage, zum Beispiel Aufruf einer Funktion in C#, die das gleiche wie die Auswahl einer Datei in Windows Explorer und Drücken Ctrl + X.Ausschneiden von Dateien in die Zwischenablage in C#

Nach dem Ausführen des Programms und drücken Ctrl +V in einem anderen Ordner auf der Festplatte, würde die ursprüngliche Datei sein in den neuen Ordner verschoben. Durch Blick auf Stack Overflow Frage Copy files to clipboard in C#, weiß ich, dass es einfach ist, den Kopierjob zu machen, aber schneiden scheint anders zu arbeiten. Wie kann ich das machen?

Antwort

17

Bitte versuchen Sie die folgende, übersetzt von The Code Project Artikel 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

Ja, ich meine "Daten". –

+0

Funktioniert perfekt, danke! :) – friederbluemle

+0

Danke, ich habe versucht, 'Clipboard.SetFileDropList' zu verwenden und es wurde eine Ausnahme geworfen, aber Ihre Methode funktioniert wie ein Charme! –

2

Nur um zu sehen, was passiert, ersetzt ich das MemoryStream mit einem DragDropEffects wie folgt aus:

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

Anscheinend funktioniert es eher als echter Schnitt als als Kopie! (Das war auf Windows   7 - Ich habe andere Betriebssysteme nicht ausprobiert). Leider funktioniert es nur zufällig. Zum Beispiel

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

ergibt keine Kopie (immer noch ein Schnitt). Es scheint, dass eine Nicht-Null einen Schnitt, eine Null eine Kopie verursacht.

+0

sehe meine Antwort, die die DragDropEffects enum verwendet. –

0

Ich möchte Code wie folgt in eine API einbinden, die Sinn macht. Ich mag auch magische Zeichenfolgen wo ich kann vermeiden.

Ich kam mit dieser Erweiterungsmethode, die das Rätsel löst, das @Keith in seiner Antwort konfrontiert war, effektiv mit der DragDropEffects enum.

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