发送文件到回收站

目前我正在使用以下function

file.Delete(); 

但是我怎样才能使用这个函数发送文件到回收站,而不是直接删除呢?

注意:这也不适用于Windows服务等非UI交互式应用程序

这个包装可以为您提供所需的function:

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

使用FileSystem.DeleteFile并指定正确的RecycleOption 。

虽然这将与UI交互式应用程序一起使用,但它不适用于非UI交互式应用程序,如Windows服务应用程序。

来自MSDN :

添加对Microsoft.VisualBasic程序集的引用。 所需的类在这个库中find。

using Microsoft.VisualBasic.FileIO将此使用语句添加到文件的顶部;

使用FileSystem.DeleteFile删除一个文件,它可以select是否指定回收站。

使用FileSystem.DeleteDirectory删除一个目录,并指定将其发送到回收站的选项。

不幸的是,你需要使用Win32 API来删除文件到回收站。 根据这篇文章尝试下面的代码。 它使用通用SHFileOperation函数通过Windows Shell进行文件系统操作。

定义以下(在一个实用程序类可能是最好的)。

 [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)] 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 

而要使用它来删除一个文件,发送到回收站,你想要的东西是这样的:

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

这些答案是否严肃?

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

而已。 您也可以使用这个库,在回收站中做其他事情。


在COM菜单中添加“Microsoft Shell Controls And Automation”库,以使用Shell32命名空间。 这是dynamic链接,而不是与您的程序编译。

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

你可以使用DllImport SHFileOperation来做到这一点。