【问题标题】:OpenFileDialog & SaveFileDialog Pop-up search with filter in C#OpenFileDialog 和 SaveFileDialog 在 C# 中使用过滤器弹出搜索
【发布时间】:2019-01-08 16:58:13
【问题描述】:

我有带过滤器的 openFileDialog 和 saveFileDialog(只有 .dvbcfg 扩展名):

SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "DVB Configuration File (*.dvbcfg)|*.dvbcfg";
saveFileDialog.DefaultExt = "dvbcfg";
saveFileDialog.AddExtension = true;

它可以正常工作,但是当我尝试手动输入文件名时,它会显示带有任何扩展名的文件(没有过滤)并打开/保存它们(第一个 - 打开文件,第二个 - 保存文件): ScreenShot

如何显示匹配saveFileDialog.Filter的文件?

附注我在 saveFileDialog 中有覆盖功能。

UPD我有另一个选项 - 当用户选择错误的文件类型时抛出异常,但我不知道如何从 saveFileDialog.FileName 字符串中仅获取文件扩展名。

【问题讨论】:

  • 我认为你做不到。您始终可以在文件名文本字段中输入*.*,然后按回车键,这将显示当前目录中的所有文件,完全忽略过滤器下拉菜单。
  • 问题是使用错误的文件可能会损坏昂贵的设备(本例中为 DVB-3030 数字调制器),即使我使用 try/catch 从文件中获取变量(它们需要整数,在尝试段中,我有 Convert.ToInteger32) 和 if/else 检查中的变量范围(例如,频率范围应为 10MHz - 90 MHz,步长为 100Hz)。由于程序将被学生使用,他们可以故意尝试破坏它。
  • @NaiLeD 您可以通过验证选定的文件名和内容轻松避免这种情况。无论如何,即使您信任您的用户,您也必须这样做

标签: c# filter openfiledialog savefiledialog


【解决方案1】:

在某些时候,您必须“信任”您的用户。您可以引导他们找到使用您的程序的好方法,但在某个时候,您必须认识到您在他们的方式中设置了足够的简单障碍来阻止意外误用1,但您不太可能(在这些对话框中)设置足够的障碍来防止恶意误用。

问题是使用错误的文件可能会损坏昂贵的设备(在这种情况下为 DVB-3030 数字调制器),即使我使用 try/catch 从文件中获取变量(它们需要是整数,在 try 段中)我在 if/else 检查中有Convert.ToInteger32) 和可变范围(例如,频率范围应为 10MHz - 90 MHz,步长为 100Hz)。由于程序将被学生使用,他们可以故意尝试破坏它。

您当前的问题(或寻求的答案)中的任何内容都不会阻止某人将任意文件重命名为具有 .dvbcfg 扩展名。

此时,您“相信”用户已为您提供了他们希望使用的文件名。您接下来需要做的是验证文件的内容。如果它具有.dvbcfg 扩展名但实际上不是有效的 DVB 配置文件,则需要拒绝它。如果它没有.dvbcfg 扩展名(嘿,也许他们正在使用只允许 8.3 文件名的旧文件系统:-))但结果是有有效内容,为什么要粗鲁和 reject 那个文件?

我建议不要将 ToInteger32 调用包含在 try/catch 中。浏览文件。确保它包含应该包含的内容,没有其他内容。阅读每个参数值,并可能在这些参数上使用TryParse。因为您的代码现在“期望”接收无效输入。然后验证范围等。


1我想说你已经得到了。

【讨论】:

  • 因为 .dvbcfg 文件只能通过使用这个程序来创建,所以我决定添加所有值的 MD5 校验和以保存到文件中。另外,通过说“无效输入”,我的意思是:通常没有无效值可以通过我所做的检查(仅对 DVB-3030 有效),但是,例如,在设定频率下将信号功率设置为 50 dBm 90 MHz 可能会导致触犯法律(只是一个例子),因此触犯法律将是用户的良心,但我想保护他们不要使用可能导致他们意外触犯法律的修改文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多