我有带有过滤器的openFileDialog和saveFileDialog(仅 .dvbcfg 扩展名):
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "DVB Configuration File (*.dvbcfg)|*.dvbcfg";
saveFileDialog.DefaultExt = "dvbcfg";
saveFileDialog.AddExtension = true;
它可以正常工作,但是当我尝试手动键入filename时,它将显示没有扩展名的文件而没有过滤并打开/保存它们(第一个-打开文件,第二个-保存文件): ScreenShot
如何显示与 saveFileDialog.Filter 匹配的仅文件?
P.S。我在saveFileDialog中有覆盖功能。
UPD 我还有另一个选择-当用户选择错误的文件类型时引发异常,但是我不知道如何从 saveFileDialog.FileName 字符串中仅获取文件扩展名。 / p>
答案 0 :(得分:1)
在某些时候,您必须“信任”用户。您可以将引导给他们使用程序的好方法,但是在某些时候,您必须认识到您已经以足够的方式设置了简单障碍来防止意外滥用 1 ,但您不可能(在这些对话框中)创建足够的屏障来防止恶意滥用。
问题是使用错误的文件可能会损坏昂贵的设备(在这种情况下为DVB-3030数字调制器),即使我使用try / catch从文件中获取变量(在try段中,它们必须是整数)我有
Convert.ToInteger32
和if / else检查中的可变范围(例如,频率范围应为10MHz-90 MHz,步长为100Hz)。由于该程序将由学生使用,因此他们可以有意尝试破坏它。
您当前的问题(或寻求的答案)中的任何内容都不会阻止某人重命名任何具有.dvbcfg
扩展名的任意文件。
在这一点上,您“信任”用户已为您提供了他们希望使用的文件名。接下来,您需要验证文件的内容。如果扩展名为.dvbcfg
,但实际上不是有效的DVB配置文件,则需要拒绝它。如果没有.dvbcfg
扩展名(嘿,也许他们正在使用仅允许8.3文件名的旧文件系统使用:-)),但实际上包含有效内容,为什么要加以修饰并拒绝该文件?
除了将ToInteger32
调用包装在try
/ catch
中之外,我还建议您采取其他措施。浏览文件。确保它完全包含应包含的内容。读取每个参数值,并可能在其上使用TryParse
。因为您的代码现在“期望”接收无效的输入。然后验证范围等。
1 我会说你已经有了。