2010-01-16 19 views
11

Sto cercando un modo per tagliare un file negli appunti a livello di codice, ad esempio, alcune chiamate a una funzione in C# che equivale a selezionare un file nello Windows Explorer e premendo Ctrl + X.Taglia file negli appunti in C#

Dopo aver eseguito il programma e premendo Ctrl + V in qualche altra cartella sul disco rigido, il file originale sarebbe spostato nella nuova cartella. Guardando Stack Overflow domanda Copy files to clipboard in C#, so che è facile fare il lavoro di copia, ma il taglio sembra funzionare diversamente. Come posso fare questo?

risposta

17

Si prega di provare la seguente, tradotto dal The Code Project articolo 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

Sì, volevo dire "dati". –

+0

Funziona perfettamente, grazie! :) – friederbluemle

+0

Grazie, stavo cercando di usare 'Clipboard.SetFileDropList' e lanciava un'eccezione, ma il tuo metodo funziona come un incantesimo! –

2

solo per vedere cosa succede, ho sostituito il MemoryStream con un DragDropEffects come questo:

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

Apparentemente , funziona come un vero taglio piuttosto che una copia! (Era su Windows   7 - Non ho provato altri sistemi operativi). Sfortunatamente, funziona solo per coincidenza. Ad esempio,

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

non produce una copia (ancora un taglio). Sembra che un non-null causi un taglio, una copia nullo.

+0

vedere la mia risposta, che utilizza l'enumerazione DragDropEffects. –

0

Mi piace racchiudere codice come questo in un'API che abbia senso. Mi piace anche evitare stringhe magiche di byte dove posso.

Mi è venuto in mente questo metodo di estensione che risolve il mistero che @Keith stava affrontando nella sua risposta, utilizzando efficacemente l'enum 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); 
    } 
}