使用 FileSystem.DeleteDirectory 将多个目录发送到回收站
本文关键字:回收站 FileSystem DeleteDirectory 使用 | 更新日期: 2023-09-27 18:34:19
制作一个包含大量函数的文件浏览器,回来微调我的一些方法来找到这个:
foreach (ListViewItem item in listView1.SelectedItems)
{
FileSystem.DeleteDirectory(item.SubItems[3].Text,
UIOption.AllDialogs,
RecycleOption.SendToRecycleBin,
UICancelOption.ThrowException);
}
将单个目录或文件发送到回收站效果很好,但它会提示每个选定的项目。不适合删除一堆文件和文件夹。
有什么方法可以在没有过多提示的情况下实现这一目标?还是我必须深入研究SHFILEOPSTRUCT?
感谢您的帮助,到目前为止,我 90% 的问题已经在这里得到了回答,这是有史以来最好的网站。
如果您不需要提示,可以使用 Directory.Delete 而不是 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;
}
}
foreach (ListViewItem item in listView1.SelectedItems)
{
int result = Win32ApiUtils.DeleteFilesToRecycleBin(item.SubItems[3].Text);
if(result != 0) ...... // ??? throw ??? message to user and contine ???
}
--警告--此代码需要测试。我在 PInvoke 网站上找到了 SHFILEOPSTRUCT 的布局,在该链接上有一些关于所用字符串声明的注释。
好吧。 在我的 Win7 64 位上测试,有一个目录要删除。像魅力一样工作。