2011-10-12 48 views
0

我有一点问题。我编写了一个winforms应用程序,它可以递归地搜索指定文件夹及其子文件夹中的文件。当我第一次运行应用程序时,该方法需要10分钟才能找到100'000个文件,但是当我第二次执行搜索方法时(无需关闭并重新打开窗体),它需要两倍的时间。为什么需要两倍的时间?递归搜索方法需要在第二次运行时,双倍的时间量

编辑:第一searchrun:10分钟,第二次运行:20分钟,第三次运行40分钟......

这里我搜索方法:

 public void dirsearch(string sdir) 
     { 
     this.Invoke((MethodInvoker)delegate 
     { 
      progressBar.Refresh(); 
      dataGridView.Refresh(); 
      // runs on UI thread 
     }); 
      foreach (string d in Directory.GetDirectories(sdir)) 
      { 
       try 
       { 
        foreach (string f in Directory.GetFiles(d)) 
        { 
         if (Regex.IsMatch(f, searchPattern, RegexOptions.IgnoreCase)) 
         { 
          FileInfo file = new FileInfo(f); 
          string fileName = file.Name; 
          string filePath = f; 
          string user = File.GetAccessControl(filePath).GetOwner(typeof(System.Security.Principal.NTAccount)).ToString(); 
          properties.Add(new FileProperties(file.Name, f, file.Length, file.LastWriteTime)); 
          //dataGridView.Refresh(); 
          //progressBar.Refresh(); 
         tryagainpoint: 
          cmd.CommandText = String.Format("insert into Attribute (Dateiname, Dateipfad, Dateierstellungsdatum, Dateiendung, Grösse, Ersteller, Letztes_mal_bearbeitet, FS) values ('{0}', '{1}', '{2}', '{3}', {4}, '{5}', '{6}', {7})", file.Name, f, file.CreationTime, file.Extension, file.Length, user, file.LastWriteTime, ID); 
          try 
          { 
           cmd.ExecuteNonQuery(); 
          } 
          catch (OleDbException) 
          { 
           if (file.Name.Contains(@"'")) 
           { 
            fileName = file.Name.Replace(@"'", @"''"); 
            filePath = f.Replace(@"'", @"''"); 
            goto tryagainpoint; 
           } 
          } 
          finally 
          { 
           file = null; 
          } 
         } 


        } 

        dirsearch(d); 
        progressBar.MarqueeAnimationSpeed = 0; 
       } 

       catch (Exception exc) //Schreibt geworfene Exception in logfile.txt 
       { 
        WriteExceptionIntoTxtFile(exc); 
        continue; 
       } 
     } 
    } 
+0

什么是属性对象?更多你应该使用插入语句的参数(摆脱去) –

回答

1

之间做你清晰集 “属性”这两个电话。如果不是,则该集合将在第二次调用该函数的开始处包含100,000个条目,并在最后包含200,000个条目。使用分组时,数据网格存在性能问题!

顺便说一句:代码会更快,如果你没有刷新datagrid和每个找到文件后的进度条!

+1

是的我清除两个调用之间的属性集合。刷新是针对最终用户的,所以他看到有些东西在起作用。 – Alex

+0

我在每次找到文件后更新了刷新错误,现在速度稍快,但在第二次运行中仍需要两倍的时间。 – Alex

+0

分组在GridView中被激活吗? – Fischermaen

相关问题