none
Form中OpenFileDialog在多选文件中的两个Bug RRS feed

  • 问题

  • Bug1 : 大目录操作时效率无法接受

    现象: 当OpenFileDialog打开一个拥有很多文件的目录时,操作会异常缓慢,程序处于无相应装台,近乎死机。 10000个文件的目录,任何操作大约需要5-10秒。

    重现:让OpenFileDialog打开一个拥有10000个文件的目录,做任何操作,如选定一个文件,或选定多个文件,或按Ctl+A

    期待的结果:像文件管理器一样。 10000个文件的目录打开<1秒

    =====================================================

    Bug2 文件多选时,无法处理全部所选文件。

    现象: 当一次选择的文件过多时, 系统弹出一个对话框,提示“[crrDir] Page is not exist. Please make sure the file name is currently given.”

    重现:让OpenFileDialog打开一个拥有10000个文件的目录,按Atl+A 选择全部文件,然后点击“打开”按钮。

    期待的正确效果: 和选择几个少数文件一样,没有任何提示,正确返回全部所选文件。

    ===========================

    注:VS 2008 ,C#

    2010年4月23日 9:46

答案

  • Bug1: 那是文件系统的预读问题,请参考操作系统的知识。 另外。。。在我的测试环境,开两千个文件非常流畅,没有任何停顿。

    Bug2:  那是 dialog 里面 File name 的文本框里,堆积了太多的文件名。只要单个文件名不长,两千个文件是毫无问题的。

    综上所述,跟 OpenFileDialog 一点关系都没有。

     

    参考代码:

     public partial class Form1 : F
     {
     private readonly string testDirectory = @"D:\TestDirectory";
    
     public Form1()
     {
      InitializeComponent();
     }
    
     private void btnCreate_Click(object sender, EventArgs e)
     {
      if (Directory.Exists(testDirectory) == true)
      {
      Directory.Delete(testDirectory, true);
      }
      Directory.CreateDirectory(testDirectory);
    
      for (int i = 0; i < 2000; i++)
      {
      string fileName = string.Format(@"F_{0}.txt", i.ToString());
      StreamWriter writer = new StreamWriter(Path.Combine(testDirectory, fileName), false, Encoding.UTF8);
      writer.WriteLine(i.ToString());
      writer.Close();
      }
    
      MessageBox.Show(@"done");
     }
    
     private void btnOpen_Click(object sender, EventArgs e)
     {
      OpenFileDialog dialog = new OpenFileDialog();
      dialog.Multiselect = true;
      dialog.ShowDialog();
    
      MessageBox.Show(string.Format(@"Selected files count:{0}", dialog.FileNames.Length.ToString()));
     }
     }
    

     

     

    • 已编辑 IGabriel 2010年4月28日 8:15 错别字
    • 已标记为答案 KeFang Chen 2010年4月29日 6:23
    2010年4月28日 8:12

全部回复

  • 刚才看到一个文档,只说了原因,但是没有给出解决方案。 太不负责任了:(

    听说最多只能选200个文件。。

    ==================================================

     

    2010年4月23日 10:13
  • 看来VS不打算改进这个dlg了?
    2010年4月28日 1:29
  • Bug1: 那是文件系统的预读问题,请参考操作系统的知识。 另外。。。在我的测试环境,开两千个文件非常流畅,没有任何停顿。

    Bug2:  那是 dialog 里面 File name 的文本框里,堆积了太多的文件名。只要单个文件名不长,两千个文件是毫无问题的。

    综上所述,跟 OpenFileDialog 一点关系都没有。

     

    参考代码:

     public partial class Form1 : F
     {
     private readonly string testDirectory = @"D:\TestDirectory";
    
     public Form1()
     {
      InitializeComponent();
     }
    
     private void btnCreate_Click(object sender, EventArgs e)
     {
      if (Directory.Exists(testDirectory) == true)
      {
      Directory.Delete(testDirectory, true);
      }
      Directory.CreateDirectory(testDirectory);
    
      for (int i = 0; i < 2000; i++)
      {
      string fileName = string.Format(@"F_{0}.txt", i.ToString());
      StreamWriter writer = new StreamWriter(Path.Combine(testDirectory, fileName), false, Encoding.UTF8);
      writer.WriteLine(i.ToString());
      writer.Close();
      }
    
      MessageBox.Show(@"done");
     }
    
     private void btnOpen_Click(object sender, EventArgs e)
     {
      OpenFileDialog dialog = new OpenFileDialog();
      dialog.Multiselect = true;
      dialog.ShowDialog();
    
      MessageBox.Show(string.Format(@"Selected files count:{0}", dialog.FileNames.Length.ToString()));
     }
     }
    

     

     

    • 已编辑 IGabriel 2010年4月28日 8:15 错别字
    • 已标记为答案 KeFang Chen 2010年4月29日 6:23
    2010年4月28日 8:12
  • 这与 OpenFileDialog 无关。OpenFileDialog 是基于 comctl32.dll 的,Windows 自身其他程序也是用这个的,并且 OpenFileDialog 里面那个选择文件的框就是资源管理器的文件列表对象。.NET 的 Common Dialog 只是让本来 COM 的 Common Controls version 6 让 .NET 可以用罢了,并不是自己重新设计的。
    Mark Zhou
    2010年4月28日 10:13