C#删除文件夹和文件到回收站示例


在C#中,直接删除文件夹和文件到Windows的回收站(而不是永久删除)并不是一个内置的简单操作,因为.NET Framework的`System.IO`命名空间并不直接支持将文件或文件夹移动到回收站。但是,我们可以通过调用Windows API或使用第三方库来实现这个功能。

一个常见的方法是使用`SHFileOperation`函数,该函数是Windows Shell的一部分,可以用来执行与文件和文件夹相关的各种操作,包括移动到回收站。不过,这通常需要一些P/Invoke(平台调用)代码来从C#调用C/C++函数。

由于直接给出完整的P/Invoke代码可能相对复杂且超出了简洁性的要求,我会提供一个简化的示例思路,并假设你已经有了一些基本的P/Invoke经验。

### 简化示例思路

1. **引入必要的命名空间**:


   using System;
   using System.Runtime.InteropServices;
   

2. **声明`SHFileOperation`结构和函数**:

你需要声明`SHFILEOPSTRUCT`结构体和`SHFileOperation`函数。这些通常通过P/Invoke从`shell32.dll`中引入。


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

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

3. **设置`SHFILEOPSTRUCT`并执行操作**:

你需要设置`SHFILEOPSTRUCT`的字段,特别是`wFunc`(操作类型,对于移动到回收站是`FO_DELETE`加上`FOF_ALLOWUNDO`)和`pFrom`(要删除的文件的路径)。


   public void DeleteToRecycleBin(string path)
   {
       SHFILEOPSTRUCT fileOp = new SHFILEOPSTRUCT
       {
           wFunc = (uint)(FO.FO_DELETE | FO.FOF_ALLOWUNDO | FO.FOF_SILENT | FO.FOF_NOCONFIRMATION | FO.FOF_NOERRORUI),
           pFrom = path + "\0\0", // 注意结尾需要两个null字符
           fFlags = 0,
           hwnd = IntPtr.Zero,
           fAnyOperationsAborted = false,
           hNameMappings = IntPtr.Zero,
           lpszProgressTitle = null
       };

       int result = SHFileOperation(ref fileOp);

       if (result != 0)
       {
           // 处理错误
           throw new Exception("Failed to delete to recycle bin.");
       }
   }

   // FO枚举需要在你的代码中定义,表示不同的文件操作
   private enum FO : uint
   {
       FO_MOVE = 0x0001,
       FO_COPY = 0x0002,
       FO_DELETE = 0x0003,
       FOF_ALLOWUNDO = 0x0040,
       FOF_SILENT = 0x0004,
       FOF_NOCONFIRMATION = 0x0010,
       FOF_NOERRORUI = 0x0400,
       // 可能还有其他需要的标志
   }
   

注意:这个示例可能需要根据你的具体需求进行调整,特别是错误处理和文件路径的处理。

4. **调用`DeleteToRecycleBin`方法**:


   DeleteToRecycleBin(@"C:\path\to\your\folder_or_file");
   

请记住,由于直接操作Windows Shell API,你的应用程序可能需要特定的权限才能执行这些操作,并且它的行为可能会因Windows版本和配置的不同而有所差异。此外,处理文件和文件夹时总是存在风险,因此请确保你有适当的错误处理和用户反馈机制。