/// <summary> /// 清空回收站,这个方法同SHEmptyRecycleBin函数一样调用 /// </summary> /// <param name="hwnd">在调用SHEmptyRecycleBin期间,指向用来显示的对话框的父窗体的句柄 /// 可为NULL值 /// </param> /// <param name="rootpath">最大长度为260个字符的字符串,指定磁盘根目录或文件夹目录,可为null,则清空整个回收站的内容</param> /// <param name="dwFlags">SHERB枚举,可组合使用</param> /// <returns>成功返回0,否则为OLE定义的错误值</returns> public uint EmptyRecycleBin(IntPtr hwnd, string rootpath, SHERB dwFlags) { _rbState rvs = new _rbState(hwnd, rootpath, dwFlags); rvs.Revalue = 0x8000FFFF; long size, items; this.QuerySizeRecycleBin(out size, out items); if (size == 0) { return(rvs.Revalue); } lock (rvs) { Thread t = new Thread( new ParameterizedThreadStart(this.wrokThread)); t.SetApartmentState(ApartmentState.STA); t.Start(rvs); } /* Console.WriteLine("aaa");测试了,同一个对象实例,依次调用EmptyRecycleBin * 的任何一个重载,其顺序总是:先被调用的,总是先运行,后面的--排队等待 * 这样的原因是ewh是AUTO的,set之后,同样命名的对象就不会wait了 */ this.ewh.WaitOne(); this.ewh.Reset(); return(rvs.Revalue); }
/// <summary> /// 清空整个回收站的内容 /// </summary> /// <returns>成功返回0,否则为OLE定义的错误值</returns> public uint EmptyRecycleBin() { _rbState rvs = new _rbState(); rvs.Revalue = 0x8000FFFF; long size, items; this.QuerySizeRecycleBin(out size, out items); if (size == 0) { return(rvs.Revalue); } lock (rvs) { Thread t = new Thread( new ParameterizedThreadStart(this.wrokThread)); t.SetApartmentState(ApartmentState.STA);//将线程设置为STA t.Start(rvs); } this.ewh.WaitOne(); this.ewh.Reset(); return(rvs.Revalue); }
/* * 注意:多个对象实例(不同引用的),如果调用EmptyRecycleBin方法的任何重载, * 它们的调用是顺序的,(就好象在单个线程里的调用是一样的)*/ //-------------- /*这个类的实现是,在内部创建一个线程调用wrokThread,这样做的原因是将对象完全封装起来, * 因为并不能确定用户调用SHEmptyRecycleBin函数的线程模式是否为STA模式, * SHEmptyRecycleBin函数必须在STA模式下才能正确调用,这个类采用一个折衷的方法来实现。 * 当调用EmptyRecycleBin方法之一的重载,都在内部创建一个线程,将线程模式设置为STAThread * */ private void wrokThread(object state) { //state对象转换_rbState lock (state) { /*同步*/ _rbState temp = (_rbState)state; temp.Revalue = LibWarp.SHEmptyRecycleBinW( temp.Hwnd, temp.Rootpath, temp.Sherb); ((_rbState)state).Revalue = temp.Revalue; } this.ewh.Set(); }
/// <summary> /// 清空整个回收站的内容 /// </summary> /// <returns>成功返回0,否则为OLE定义的错误值</returns> public uint EmptyRecycleBin() { _rbState rvs = new _rbState(); rvs.Revalue = 0x8000FFFF; long size, items; this.QuerySizeRecycleBin(out size, out items); if (size == 0) return rvs.Revalue; lock (rvs) { Thread t = new Thread( new ParameterizedThreadStart(this.wrokThread)); t.SetApartmentState(ApartmentState.STA);//将线程设置为STA t.Start(rvs); } this.ewh.WaitOne(); this.ewh.Reset(); return rvs.Revalue; }
/// <summary> /// 清空回收站,这个方法同SHEmptyRecycleBin函数一样调用 /// </summary> /// <param name="hwnd">在调用SHEmptyRecycleBin期间,指向用来显示的对话框的父窗体的句柄 /// 可为NULL值 /// </param> /// <param name="rootpath">最大长度为260个字符的字符串,指定磁盘根目录或文件夹目录,可为null,则清空整个回收站的内容</param> /// <param name="dwFlags">SHERB枚举,可组合使用</param> /// <returns>成功返回0,否则为OLE定义的错误值</returns> public uint EmptyRecycleBin(IntPtr hwnd, string rootpath, SHERB dwFlags) { _rbState rvs = new _rbState(hwnd, rootpath, dwFlags); rvs.Revalue = 0x8000FFFF; long size, items; this.QuerySizeRecycleBin(out size, out items); if (size == 0) return rvs.Revalue; lock (rvs) { Thread t = new Thread( new ParameterizedThreadStart(this.wrokThread)); t.SetApartmentState(ApartmentState.STA); t.Start(rvs); } /* Console.WriteLine("aaa");测试了,同一个对象实例,依次调用EmptyRecycleBin 的任何一个重载,其顺序总是:先被调用的,总是先运行,后面的--排队等待 * 这样的原因是ewh是AUTO的,set之后,同样命名的对象就不会wait了 */ this.ewh.WaitOne(); this.ewh.Reset(); return rvs.Revalue; }