清空回收站,可调用SHEmptyRecycleBin 函数,在shell32.dll,dwFlags参数指定清空回收站时,是否显示提示操作的对话框?显示删除过程的进度条? 静音操作?
注意:SHEmptyRecycleBin 函数必须在标识为STA的线程里才能成功调用
调用SHQueryRecycleBin 函数查询 指定目录(或者整个回收站,当pszRootPath参数为null时),有多少个被删除到回收站的项,以及它们占用多大的空间
在客户端的代码实现处不能确定调用SHEmptyRecycleBin 函数的线程是否是一个STA线程,或许它就是一个MTA线程,并且线程一旦在运行,就不能改变它的单位状态,也就是:不能调用Thread.SetApartmentState来设置已经在运行的线程的单位状态。.net默认的线程为MTA单位.因此想要成功调用SHEmptyRecycleBin 必须在STA的线程里;或者开启一个新的STA线程来操作:只有这样才能在不影响其他代码在实现的限制。
RecycleBinInfo类是对SHEmptyRecycleBin 函数和SHQueryRecycleBin 这两个函数的封装,如果用户调用RecycleBinInfo.SHEmptyRecycleBin 的任何一个重载都会在内部开启一个STA单位的线程,这样,在不影响外部线程单位状态的前提下实现清空回收站。
这里是代码实现,可导出为DLL
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Threading;
using System.Runtime.InteropServices;
namespace Feng {
namespace WinShellApi {
[Flags]
public enum SHERB:uint {
/* #define SHERB_NOCONFIRMATION 0x00000001
#define SHERB_NOPROGRESSUI 0x00000002
#define SHERB_NOSOUND 0x00000004*/
/// <summary>
/// 不选择其他的三个项,不可与其他选项同时使用
/// </summary>
SHERB_GENNERAL=0x00000000,
/// <summary>
/// 不显示确认删除的对话框
/// </summary>
SHERB_NOCONFIRMATION = 0x00000001,
/// <summary>
/// 不显示删除过程的进度条
/// </summary>
SHERB_NOPROGRESSUI=0x00000002,
/// <summary>
/// 当删除完成时,不播放声音
/// </summary>
SHERB_NOSOUND = 0x00000004
};
[StructLayout(LayoutKind.Explicit,Pack=2)]
public struct SHQUERYRBINFO {
//这个结构必须是用户显示编写偏移量才能准确获取数值
[FieldOffset(0)]
public int cbsize;
[FieldOffset(4)]
public long i64Size;
[FieldOffset(12)]
public long i64NumItems;
};
public static class LibWarp {
/// <summary>
/// 清空指定磁盘或目录的回收站的内容
/// </summary>
/// <param name="hwnd">对话框的句柄,通常应当设为NULL</param&