/// <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();
            }
示例#4
0
            /// <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;
            }
示例#5
0
            /// <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;
            }