打开文件对话框与多个扩展名

6

我需要一个可以打开1000种文件类型(*.000 - *.999)的文件对话框。 但是,如果将其添加到过滤器中,选择文件类型时对话框会变得非常缓慢。有什么方法可以加快速度吗?

string text; 
for (int i = 0; i <= 999; i++)
{
    text.Append("*." + i.ToString("000") + "; ");
}

string textWithoutLastSemicolumn = text.ToString().Substring(0, text.ToString().Length - 2);
dialog.Filter = "Files (" + textWithoutLastSemicolumn + ")|" + textWithoutLastSemicolumn;

你有任何网络连接的快捷方式吗? - Abhishek
1
我可以问一下,你为什么要这样做呢?o_O - DerApe
1
我会加入@derape的评论,添加这么多扩展名到打开文件对话框的目的是什么? *.* 就足够了。如果你正在创建这些文件,那么首先不应该使用不同的扩展名(你可以改变文件名)。添加一些扩展名是可以的,但不要添加1000个。 - Sinatr
它可能是一个分割的压缩文件,使用该命名格式(以及其他格式)来存储文件。 - Saragis
正如 @Saragis 所提到的,这些是分割的压缩文件。 - user2332131
3个回答

6
如果你被这些扩展困住了,我可以看到2个可能的解决方案。要么接受这个相当快速但不是100%正确的解决方案:
ofd.Filter = "Supported extensions | *.0??;*.1??;*.2??;*.3??;*.4??;*.5??;*.6??;*.7??;*.8??;*.9??";

这将接受您所有的扩展名,但也包括像.0a1.99y等值。如果您知道这些文件扩展名在您的情况下不会成为问题,那么这可能是一个不错的选择。

另一种解决方案可能是制作自己的OpenFileDialog实现,并支持正则表达式作为过滤器。从性能和安全性方面来看,这将是最好的解决方案,但我不知道它会有多难。


谢谢这个提示,使用“??”在我的情况下已经足够了。 - user2332131

0

我尝试运行了OpenFileDialog,在我的情况下似乎运行得很快:

StringBuilder sb = new StringBuilder();
for (int i = 0; i <= 999; i++)
{
    sb.Append("*.");
    sb.Append(i.ToString("000"));
    sb.Append("|");
}
sb.Remove(sb.Length - 1, 1);
string text = sb.ToString();

OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Files (" + text + ")|" + text;
ofd.ShowDialog(this);

我使用了 StringBuilder 来构建过滤器。然后将其转换为字符串并传递给 .Filter 属性。

只是为了确保这里有一个代码,可以在文件类型列表框中创建 1000 个条目:

StringBuilder sb = new StringBuilder();
for (int i = 0; i <= 999; i++)
{
    sb.Append("*.");
    sb.Append(i.ToString("000"));
    sb.Append("|");
}
sb.Remove(sb.Length - 1, 1);
string text = sb.ToString();

OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = text;
ofd.ShowDialog(this);

即使使用了 StringBuilder,这段代码在这里也需要20秒的时间。 - Patrick Hofman
我修改了for循环,使用管道符号(不包括“Test”单词)来构建过滤器,在我的机器上运行得很快。我想知道其中的区别是什么。 - Joel Legaspi Enriquez
你的代码生成了1000个条目,而OP的代码只生成了一个。 - Patrick Hofman
仍然无法正常运行。在这里需要25秒钟。在你的机器上会怎么样? - Patrick Hofman
没错,感谢更正。加载速度很快,直到下拉列表被点击时变慢。但是加载对话框和构建过滤器并不需要太多时间。 - Joel Legaspi Enriquez
显示剩余2条评论

-2
您可以添加以下行。
dialog.AutoUpgradeEnabled = false;

OpenFileDialog 的这个属性将设置对话框在运行于 Vista 或更高版本时是否应升级其行为和外观。将其设置为 false,我们使 UI 渲染更简单,从而使对话框更快。

这是我尝试的代码:

OpenFileDialog dialog = new OpenFileDialog();
StringBuilder text = new StringBuilder();
for (int i = 0; i <= 999; i++)
{
    text.Append("*." + i.ToString("000") + "; ");
}

string textWithoutLastSemicolumn = text.ToString().Substring(0,    text.ToString().Length - 2);
dialog.AutoUpgradeEnabled = false;
dialog.Filter = "Files (" + textWithoutLastSemicolumn + ")|" + textWithoutLastSemicolumn;
dialog.ShowDialog();

我将这段代码添加到一个空的 Windows 窗体的 Load 事件中。

2
也许你应该包含它实际执行的内容以及为什么这样可以解决问题。 - DerApe
不,这并不会使它更快。实际上我已经测试过了,在这种情况下它没有帮助。 - Patrick Hofman
我应该发布我尝试过的代码吗?它对我有效。 - Abhishek
试试吧,何乐而不为。 - Patrick Hofman
点击下拉列表时,遗憾的是并没有解决这个问题。 - user2332131

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接