C# 使用FileSystem.DeleteDirectory将多个目录发送到回收站

C# 使用FileSystem.DeleteDirectory将多个目录发送到回收站,c#,file-io,C#,File Io,制作一个具有大量功能的文件浏览器,回来微调我的一些方法以找到以下内容: foreach (ListViewItem item in listView1.SelectedItems) { FileSystem.DeleteDirectory(item.SubItems[3].Text, UIOption.AllDialogs, RecycleOption.SendToRecycleBin, UICancelOption.ThrowExce

制作一个具有大量功能的文件浏览器,回来微调我的一些方法以找到以下内容:

foreach (ListViewItem item in listView1.SelectedItems)
{
    FileSystem.DeleteDirectory(item.SubItems[3].Text,  
        UIOption.AllDialogs,
        RecycleOption.SendToRecycleBin,
        UICancelOption.ThrowException);
}
将单个目录或文件发送到回收站非常有效,但会提示输入每个选定项目。不适合删除一堆文件和文件夹

有没有办法在没有多余提示的情况下实现这一点?还是我必须深入研究SHFILEOPSTRUCT


感谢您的帮助,到目前为止,我90%的问题都在这里得到了回答,这是有史以来最好的网站。

如果您不需要提示,可以使用
文件系统
方法。这将删除目录、文件和子目录(前提是您指定希望它这样做)。

如果不需要提示,可以使用而不是
FileSystem
方法。这将删除目录、文件和子目录(前提是您指定要这样做)。

这似乎是完成所需操作的唯一方法
在没有提示的情况下将文件和目录移动到回收站

using System.Runtime.InteropServices;

class Win32ApiUtils
{
    // Don't declare a value for the Pack size. If you omit it, the correct value is used when  
    // marshaling and a single SHFILEOPSTRUCT can be used for both 32-bit and 64-bit operation.
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct SHFILEOPSTRUCT
    {
        public IntPtr hwnd;
        [MarshalAs(UnmanagedType.U4)]
        public int wFunc;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pFrom;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pTo;            
        public ushort fFlags;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fAnyOperationsAborted;
        public IntPtr hNameMappings;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string lpszProgressTitle;
   }

   [DllImport("shell32.dll", CharSet = CharSet.Auto)]
   static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp);
   const int FO_DELETE = 3;
   const int FOF_ALLOWUNDO = 0x40;
   const int FOF_NOCONFIRMATION = 0x10; //Don't prompt the user.; 

   public static int DeleteFilesToRecycleBin(string filename)
   {
        SHFILEOPSTRUCT shf = new SHFILEOPSTRUCT();
        shf.wFunc = FO_DELETE;
        shf.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;
        shf.pFrom = filename + "\0";  // <--- this "\0" is critical !!!!!
        int result = SHFileOperation(ref shf);
        // Any value different from zero is an error to lookup 
        return result;

   }
--警告-- 这段代码需要测试。我在该链接上找到了SHFILEOPSTRUCT的布局,并且在该链接上有一些关于所用字符串声明的注释


嗯。在我的Win7 64位上测试,只需删除一个目录。就像一种魅力……

这似乎是做你所需要的事情的唯一方法
在没有提示的情况下将文件和目录移动到回收站

using System.Runtime.InteropServices;

class Win32ApiUtils
{
    // Don't declare a value for the Pack size. If you omit it, the correct value is used when  
    // marshaling and a single SHFILEOPSTRUCT can be used for both 32-bit and 64-bit operation.
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct SHFILEOPSTRUCT
    {
        public IntPtr hwnd;
        [MarshalAs(UnmanagedType.U4)]
        public int wFunc;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pFrom;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pTo;            
        public ushort fFlags;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fAnyOperationsAborted;
        public IntPtr hNameMappings;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string lpszProgressTitle;
   }

   [DllImport("shell32.dll", CharSet = CharSet.Auto)]
   static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp);
   const int FO_DELETE = 3;
   const int FOF_ALLOWUNDO = 0x40;
   const int FOF_NOCONFIRMATION = 0x10; //Don't prompt the user.; 

   public static int DeleteFilesToRecycleBin(string filename)
   {
        SHFILEOPSTRUCT shf = new SHFILEOPSTRUCT();
        shf.wFunc = FO_DELETE;
        shf.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;
        shf.pFrom = filename + "\0";  // <--- this "\0" is critical !!!!!
        int result = SHFileOperation(ref shf);
        // Any value different from zero is an error to lookup 
        return result;

   }
--警告-- 这段代码需要测试。我在该链接上找到了SHFILEOPSTRUCT的布局,并且在该链接上有一些关于所用字符串声明的注释


嗯。在我的Win7 64位上测试,只需删除一个目录。很有魅力……

是的,但这会直接删除文件,而不会将其发送到回收站,因此不符合我的目的。是否希望用户从回收站还原?有人会认为你把文件放进回收站是为了删除它们,我认为这是一个两步的过程(只是因为你想让用户看到回收站中的文件)是不直观的+1.我只是问一个问题,没有上下文,你如何提出替代方案?是的,但这将直接删除文件,而不是将其发送到回收站,因此不符合我的目的。你希望用户从回收站还原吗?有人会认为你把文件放进回收站是为了删除它们,我认为这是一个两步的过程(只是因为你想让用户看到回收站中的文件)是不直观的+1里德。我只是问一个问题,没有背景,你怎么能提出备选方案?根据(和其他许多文章)你只有一个选项SHFileOpStruct应该将此作为答案添加史蒂夫,下面的“答案”是获得所有选票。谢谢你的帮助。好吧,我将尝试用SHFILEOPSTRUCT构建一个示例,然后给出答案。Wait根据(和其他许多文章)你只有一个选项shFileOpStruct应该添加这个作为答案Steve,下面的“答案”是获得所有选票。谢谢你的帮助。好吧,我将尝试用SHFILEOPSTRUCT构建一个示例,然后给出答案。WaitWill会在我回家后进行测试,我也使用x64,但我遇到了一些技巧,使其与两者兼容。无论如何,它回答了我的问题,谢谢。可能还值得注意的是,这需要使用System.Runtime.InteropServices。当我回家后将进行测试,我也使用x64,但我遇到了一些技巧,使其与两者兼容。无论如何,这回答了我的问题,谢谢。可能还值得注意的是,这需要使用System.Runtime.InteropServices