Envoyer un fichier à la corbeille

Actuellement, j’utilise la fonction suivante

file.Delete(); 

Mais comment utiliser cette fonction pour envoyer un fichier à la corbeille au lieu de simplement le supprimer?

REMARQUE: Cela ne fonctionne pas non plus avec les applications non interactives comme Windows Services

Ce wrapper peut vous fournir les fonctionnalités nécessaires:

 using System.Runtime.InteropServices; public class FileOperationAPIWrapper { ///  /// Possible flags for the SHFileOperation method. ///  [Flags] public enum FileOperationFlags : ushort { ///  /// Do not show a dialog during the process ///  FOF_SILENT = 0x0004, ///  /// Do not ask the user to confirm selection ///  FOF_NOCONFIRMATION = 0x0010, ///  /// Delete the file to the recycle bin. (Required flag to send a file to the bin ///  FOF_ALLOWUNDO = 0x0040, ///  /// Do not show the names of the files or folders that are being recycled. ///  FOF_SIMPLEPROGRESS = 0x0100, ///  /// Surpress errors, if any occur during the process. ///  FOF_NOERRORUI = 0x0400, ///  /// Warn if files are too big to fit in the recycle bin and will need /// to be deleted completely. ///  FOF_WANTNUKEWARNING = 0x4000, } ///  /// File Operation Function Type for SHFileOperation ///  public enum FileOperationType : uint { ///  /// Move the objects ///  FO_MOVE = 0x0001, ///  /// Copy the objects ///  FO_COPY = 0x0002, ///  /// Delete (or recycle) the objects ///  FO_DELETE = 0x0003, ///  /// Rename the object(s) ///  FO_RENAME = 0x0004, } ///  /// SHFILEOPSTRUCT for SHFileOperation from COM ///  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] private struct SHFILEOPSTRUCT { public IntPtr hwnd; [MarshalAs(UnmanagedType.U4)] public FileOperationType wFunc; public ssortingng pFrom; public ssortingng pTo; public FileOperationFlags fFlags; [MarshalAs(UnmanagedType.Bool)] public bool fAnyOperationsAborted; public IntPtr hNameMappings; public ssortingng lpszProgressTitle; } [DllImport("shell32.dll", CharSet = CharSet.Auto)] private static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp); ///  /// Send file to recycle bin ///  /// Location of directory or file to recycle /// FileOperationFlags to add in addition to FOF_ALLOWUNDO public static bool Send(ssortingng path, FileOperationFlags flags) { try { var fs = new SHFILEOPSTRUCT { wFunc = FileOperationType.FO_DELETE, pFrom = path + '\0' + '\0', fFlags = FileOperationFlags.FOF_ALLOWUNDO | flags }; SHFileOperation(ref fs); return true; } catch (Exception) { return false; } } ///  /// Send file to recycle bin. Display dialog, display warning if files are too big to fit (FOF_WANTNUKEWARNING) ///  /// Location of directory or file to recycle public static bool Send(ssortingng path) { return Send(path, FileOperationFlags.FOF_NOCONFIRMATION | FileOperationFlags.FOF_WANTNUKEWARNING); } ///  /// Send file silently to recycle bin. Surpress dialog, surpress errors, delete if too large. ///  /// Location of directory or file to recycle public static bool MoveToRecycleBin(ssortingng path) { return Send(path, FileOperationFlags.FOF_NOCONFIRMATION | FileOperationFlags.FOF_NOERRORUI | FileOperationFlags.FOF_SILENT); } private static bool deleteFile(ssortingng path, FileOperationFlags flags) { try { var fs = new SHFILEOPSTRUCT { wFunc = FileOperationType.FO_DELETE, pFrom = path + '\0' + '\0', fFlags = flags }; SHFileOperation(ref fs); return true; } catch (Exception) { return false; } } public static bool DeleteCompletelySilent(ssortingng path) { return deleteFile(path, FileOperationFlags.FOF_NOCONFIRMATION | FileOperationFlags.FOF_NOERRORUI | FileOperationFlags.FOF_SILENT); } } 

Utilisez FileSystem.DeleteFile et spécifiez le bon RecycleOption .

Bien que cela fonctionne avec les applications interactives d’interface utilisateur, il ne fonctionnera pas avec des applications interactives non-interface utilisateur telles qu’une application de service Windows.

De MSDN :

Ajoutez une référence à l’assembly Microsoft.VisualBasic. La classe nécessaire se trouve dans cette bibliothèque.

Ajoutez cette instruction en haut du fichier à l’ using Microsoft.VisualBasic.FileIO ;

Utilisez FileSystem.DeleteFile pour supprimer un fichier, il a la possibilité de spécifier ou non la corbeille.

Utilisez FileSystem.DeleteDirectory pour supprimer un répertoire avec l’option permettant de l’envoyer à la corbeille ou non.

Malheureusement, vous devez utiliser l’API Win32 pour supprimer un fichier dans la corbeille. Essayez le code suivant, basé sur ce post . Il utilise la fonction générique SHFileOperation pour les opérations du système de fichiers via le shell Windows.

Définissez les éléments suivants (dans une classe d’utilitaires, c’est probablement mieux).

 [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto, Pack=1)] public struct SHFILEOPSTRUCT { public IntPtr hwnd; [MarshalAs(UnmanagedType.U4)] public int wFunc; public ssortingng pFrom; public ssortingng pTo; public short fFlags; [MarshalAs(UnmanagedType.Bool)] public bool fAnyOperationsAborted; public IntPtr hNameMappings; public ssortingng lpszProgressTitle; } [DllImport("shell32.dll", CharSet=CharSet.Auto)] public static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp); public const int FO_DELETE = 3; public const int FOF_ALLOWUNDO = 0x40; public const int FOF_NOCONFIRMATION = 0x10; // Don't prompt the user 

Et pour l’utiliser pour supprimer un fichier, l’envoyer à la corbeille, vous voulez quelque chose comme:

 var shf = new SHFILEOPSTRUCT(); shf.wFunc = FO_DELETE; shf.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION; shf.pFrom = @"C:\test.txt"; SHFileOperation(ref shf); 

Ces réponses sont-elles graves?

 using Shell32; static class Program { public static Shell shell = new Shell(); public static Folder RecyclingBin = shell.NameSpace(10); static void Main() { RecyclingBin.MoveHere("PATH TO FILE/FOLDER") } } 

C’est tout. Vous pouvez également faire pratiquement tout le rest avec le bac de recyclage en utilisant cette bibliothèque.


Ajoutez la bibliothèque “Microsoft Shell Controls And Automation” dans le menu COM pour utiliser l’espace de noms Shell32. Ceci est lié dynamicment et non compilé avec votre programme.

[1]: https://i.stack.imgur.com/erV

Vous pouvez DllImport SHFileOperation pour ce faire.