我写了一个程序,可以打开或清空回收站并位于托盘中。我使用 SHEmptyRecycleBin 执行清理,并使用 FileSystemWatcher 检测回收站文件夹中的更改。问题是当我删除非C盘的文件时,FileSystemWatcher没有反应。我将非常感谢您的帮助!
部分代码:
enum RecycleFlags : uint
{
SHRB_NOCONFIRMATION = 0x00000001,
SHRB_NOPROGRESSUI = 0x00000002,
SHRB_NOSOUND = 0x00000004
}
[DllImport("Shell32.dll", CharSet = CharSet.Unicode)]
static extern uint SHEmptyRecycleBin(IntPtr hwnd, string pszRootPath, RecycleFlags dwFlags);
static Shell shell = new Shell();
Folder recycleBin = shell.NameSpace(10);
public Form1()
{
InitializeComponent();
FileSystemWatcher watcher = new FileSystemWatcher(@"C:\\$Recycle.Bin");
watcher.Changed += OnChanged;
watcher.EnableRaisingEvents = true;
}
private void OnChanged(object sender, FileSystemEventArgs e)
{
if (recycleBin.Items().Count == 0)
{
NotifyIcon.Icon = Properties.Resources.Empty;
}
else
{
NotifyIcon.Icon = Properties.Resources.Full;
}
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("explorer.exe", "shell:RecycleBinFolder");
}
private void emptyToolStripMenuItem_Click(object sender, EventArgs e)
{
SHEmptyRecycleBin(IntPtr.Zero, null, RecycleFlags.SHRB_NOSOUND);
}
问题是你只监控C盘。正如您所确定的,C 盘上有 $Recycle.Bin 文件夹。根据文件系统的不同,它也存在于其他驱动器上。您必须监视此文件夹。从技术角度来看,如果先把数据(特别是大文件或者很多小文件)移到C中会非常耗时。对于硬盘(patetion)内的移动,您必须更改 patetion 表。