用C#写了一个批量删除QQ垃圾文件的程序,分别用file.delete()和Directory.delete()方法删除文件和目录。
结果由于要执行删除的文件实在是太多了(近千了吧),窗体从刚开始执行就假死,一直持续到程序执行完毕,其间CPU占用率飙升。结果根据我的程序的返回值来看,删除了97MB的容量用了625秒。
实在是太慢了,用windows自带的删除功能不到一分钟就搞定了。
该怎么处理这段代码啊,请各位高手指教。另外,听朋友说可以将删除操作的时候把操作权释放给操作系统就不会假死,如果能实现的话,这段代码应该是怎样的呢?

解决方案 »

  1.   

    这段代码我也看到过,还是不太明白MSDN上面写的意思,能给出一段样例代码么?
      

  2.   

    解决了,把那个代码加入到循环体里面就解决了!
    但是现在richtextbox的滚动条总是固定在上方,我想让它始终跟踪在最下方,应该怎么设置呢?
      

  3.   

    循环里面也加入:
    richtextbox.SelectionStart = richtextbox.Text.Length;
    richtextbox.ScrollToCaret();这样滚动条就会到下方了
      

  4.   

    多谢了,刚才也搜索到这段代码了。
    但是这段代码执行非常慢,删除文件刚开始速度还是很快的,但是越到后面速度越慢了,最后成了明显能看到文件一个个在消失了……
    难怪用了10分钟才删玩,这是怎么回事?比windows自带的删除慢了这么多?
      

  5.   

    richtextbox.SelectionStart = richtextbox.Text.Length; 
    richtextbox.ScrollToCaret(); 
    发现这个代码还是不行,滚动条一直在上下跳,看不清richtextbox中显示的text。
    又测试了一下速度,不知道为什么,删除大量文件的时候,file.delete()就是比windows自带的删除慢很多
      

  6.   

    哦,尝试使用多线程吧……
    另外,那个richtextbox的滚动条怎么办?
    richtextbox.SelectionStart = richtextbox.Text.Length; 
    richtextbox.ScrollToCaret(); 
    这段代码会造成滚动条不断地上下跳,这个怎么处理呢?
      

  7.   

    看看那个代码是否放错地方(在循环里?)
    richtextbox在代码里还有别的地方初始过吗?
      

  8.   

    代码放到循环里了……
    我还是把这部分代码放出来吧
    TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks); //开始计算时间
                    richTextBox1.Text = "";
                    //从得到的选定路径中筛选,是目录就执行删除目录下所有文件和文件夹,是文件执行删除文件
                    foreach (string toBeDelete in pathQueue)
                    {
                        string menuPath = Path.Combine(qqPath, toBeDelete);
                        DirectoryInfo di = new DirectoryInfo(menuPath);
    //如果是目录,删除目录下所有文件和文件夹
                        if (Directory.Exists(menuPath))
                        {
                            try
                            {
                                FileInfo[] fi = di.GetFiles();
                                //清除文件
                                foreach (FileInfo delFile in fi)
                                {
                                    Application.DoEvents();
                                    //自己写的方法,删除目录或者文件
                                    Delete(Path.Combine(menuPath, delFile.ToString()), Path.Combine(toBeDelete, delFile.ToString()),"file");
                                    richTextBox1.SelectionStart = richTextBox1.Text.Length;
                                    richTextBox1.ScrollToCaret(); 
                                }
                                DirectoryInfo[] sunDi = di.GetDirectories();
                                foreach (DirectoryInfo delDi in sunDi)
                                {
                                    
                                    Application.DoEvents();
                                    Delete(Path.Combine(menuPath, delDi.ToString()), Path.Combine(toBeDelete, delDi.ToString()),"menu");
                                    richTextBox1.SelectionStart = richTextBox1.Text.Length;
                                    richTextBox1.ScrollToCaret(); 
                                }                        }
                            catch (DirectoryNotFoundException)
                            {
                                continue;
                            }
                        }
                       //如果路径是文件,执行文件删除
                        else if (File.Exists(menuPath))
                        {
                            try
                            {
                                FileInfo fi = new FileInfo(menuPath);                            Delete(Path.Combine(menuPath, fi.ToString()),toBeDelete, "file");
                                richTextBox1.SelectionStart = richTextBox1.Text.Length;
                                richTextBox1.ScrollToCaret();                         }
                            catch (DirectoryNotFoundException)
                            {
                                continue;
                            }
                        }
                    }
                    TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks); //得到时间
                    string spanTotalSeconds = ts2.Subtract(ts1).Duration().TotalSeconds.ToString() + "秒"; 计算执行时间                richTextBox1.Text += "程序执行完毕!\n执行时间"+spanTotalSeconds+"!\n共删除容量"+label4.Text+"!";
                    richTextBox1.SelectionStart = richTextBox1.Text.Length;
                    richTextBox1.ScrollToCaret(); 
      

  9.   

    看来必须得异步了。
    刚才用了
    //上面有计算时间的代码
    deleteThread.start();//启动线程
    deleteThread.join();
    //等待删除文件完毕
    //这里也有计算时间的代码主要是为了计算这个代码用了多长时间,结果因为用了join(),窗体线程被挂起了……
    一直等到线程执行完才能能点,不过速度已经由原来的600多秒降低到了192秒,速度问题似乎是暂时解决了……正在翻异步线程的资料
      

  10.   

    使用后台线程,滚动可以发送消息.[DllImport("User32.dll", CharSet=CharSet.Auto)]
    private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
    private void ScrollTextBoxEnd()
    {
        IntPtr wParam = new IntPtr(7);
        IntPtr lParam = new IntPtr(0);
        SendMessage(this._textbox.Handle, 0x115, wParam, lParam);

      

  11.   

    调用了API?!
    这段代码是什么意思呢?能解释一下么?