2008-08-20 18 views

Répondre

38

http://www.daveamenta.com/2008-05/c-delete-a-file-to-the-recycle-bin/

en haut:

using Microsoft.VisualBasic; 

string path = @"c:\myfile.txt"; 
FileIO.FileSystem.DeleteDirectory(path, 
    FileIO.UIOption.OnlyErrorDialogs, 
    RecycleOption.SendToRecycleBin); 
+0

J'utiliser DeleteFile au lieu de DeleteDirectory pour être plus clair. – scobi

+7

+ 1 pour avoir réfléchi en dehors des sentiers battus et avoir référencé un espace de noms détesté plutôt que de recourir à un code non géré désagréable. – BenAlabaster

+2

Qu'est-ce que ces classes et méthodes FileIO ont à faire avec Visual Basic? Les mettre dans Microsoft.VisualBasic n'a absolument aucun sens pour moi. J'ai dû louper quelque chose. –

15

Vous devez plonger dans le code non managé. Voici une classe statique que je l'ai utilisé:

public static class Recycle 
{ 
    private const int FO_DELETE = 3; 
    private const int FOF_ALLOWUNDO = 0x40; 
    private const int FOF_NOCONFIRMATION = 0x0010; 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)] 
    public struct SHFILEOPSTRUCT 
    { 
     public IntPtr hwnd; 
     [MarshalAs(UnmanagedType.U4)] 
     public int wFunc; 
     public string pFrom; 
     public string pTo; 
     public short fFlags; 
     [MarshalAs(UnmanagedType.Bool)] 
     public bool fAnyOperationsAborted; 
     public IntPtr hNameMappings; 
     public string lpszProgressTitle; 
    } 

    [DllImport("shell32.dll", CharSet = CharSet.Auto)] 
    static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp); 

    public static void DeleteFileOperation(string filePath) 
    { 
     SHFILEOPSTRUCT fileop = new SHFILEOPSTRUCT(); 
     fileop.wFunc = FO_DELETE; 
     fileop.pFrom = filePath + '\0' + '\0'; 
     fileop.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION; 

     SHFileOperation(ref fileop); 
    } 
} 

Addendum:

  • Tss @ Jeff pour "en utilisant Microsoft.VisualBasic" dans le code C#.
  • Tsk tsk @ MS pour mettre tous les goodies dans l'espace de noms VisualBasic.
+11

Je suppose que c'est l'un des zones où VB est juste meilleur que C# ... d'ailleurs, ce n'est pas "pas C#" juste parce que c'est dans l'espace de noms VB - un objet est un objet, pas pour l'utiliser juste parce que c'est dans un espace de noms de est un peu ridicule ne pensez-vous pas? ... – BenAlabaster

+9

... si l'espace de noms était Microsoft.UsefulUtilities vous n'auriez pas de réserves à propos de leur utilisation, alors quelle est la différence? – BenAlabaster

+1

Il ne s'agit pas de l'espace de nommage, bien sûr, mais d'un lien dans les bibliothèques VB pour utiliser cet espace de noms. Devrait être évident. –

13

La meilleure façon que j'ai trouvé est d'utiliser la fonction VB FileSystem.DeleteFile.

Microsoft.VisualBasic.FileIO.FileSystem.DeleteFile(file.FullName, 
    Microsoft.VisualBasic.FileIO.UIOption.OnlyErrorDialogs, 
    Microsoft.VisualBasic.FileIO.RecycleOption.SendToRecycleBin); 

Il nécessite l'ajout Microsoft.VisualBasic comme référence, mais cela fait partie du framework .NET et est donc pas une dépendance supplémentaire.

D'autres solutions nécessitent un P/Invoke à SHFileOperation, ainsi que la définition de toutes les différentes structures/constantes. Y compris Microsoft.VisualBasic est beaucoup plus propre en comparaison.