C# OpenFileDialog和SaveFileDialog弹出式搜索,带有C语言中的过滤器

C# OpenFileDialog和SaveFileDialog弹出式搜索,带有C语言中的过滤器,c#,filter,openfiledialog,savefiledialog,C#,Filter,Openfiledialog,Savefiledialog,我有只带过滤器的openFileDialog和saveFileDialog。dvbcfg扩展名: SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "DVB Configuration File (*.dvbcfg)|*.dvbcfg"; saveFileDialog.DefaultExt = "dvbcfg"; saveFileDialog.AddExtension = true; 它工

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

SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "DVB Configuration File (*.dvbcfg)|*.dvbcfg";
saveFileDialog.DefaultExt = "dvbcfg";
saveFileDialog.AddExtension = true;
它工作正常,但当我尝试手动键入filename时,它会显示具有任何扩展名的文件,不进行筛选,并首先打开/保存它们-打开文件,然后保存文件:

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

另外,我在saveFileDialog中有覆盖功能


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

在某一点上,您必须信任您的用户。您可以引导他们以良好的方式使用您的程序,但在某一点上,您必须认识到,您已经在他们的方式中设置了足够多的简单障碍,以防止意外误用1,但您不太可能在这些对话框中创建足够多的障碍,以防止恶意误用


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

并且,您当前的问题或寻求的答案中没有任何内容会阻止某人重命名任何具有.dvbcfg扩展名的任意文件

此时,您相信用户已经给了您他们希望使用的文件名。接下来需要做的是验证文件的内容。如果它具有.dvbcfg扩展名,但实际上不是有效的DVB配置文件,则需要拒绝它。如果它没有.dvbcfg扩展名,嘿,也许他们使用的是一个只允许8.3文件名的旧文件系统:-但结果是有有效的内容,为什么要无礼地拒绝该文件

我建议不要只是在try/catch中包装32个Integer32调用。检查一下档案。确保它完全包含它应该包含的内容,而不包含其他内容。读取每个参数值,并可能在这些参数上使用TryParse。因为您的代码现在希望接收无效的输入。然后验证范围等


我想你已经做到了。

我认为你做不到。您可以始终在文件名文本字段中输入**,然后按enter键,这将显示当前目录中的所有文件,完全忽略过滤器下拉列表。问题是,在这种情况下,使用错误的文件可能会损坏expencive设备DVB-3030数字调制器,即使我使用try/catch从文件中获取变量,它们需要是整数,在try段中,我在if/else检查中有Convert.ToInteger32和可变范围,例如频率范围应为10MHz-90MHz,步长为100Hz。由于程序将由学生使用,他们可以有目的地尝试破坏它。@Nalled您可以通过验证选定的文件名和内容轻松避免这种情况。这是您无论如何都必须要做的事情,即使您信任您的usersSince.dvbcfg文件将仅通过使用此程序创建,我已决定添加将保存到文件中的所有值的MD5校验和。另外,通过说无效输入,我的意思是:通常没有无效值可以通过检查,我只对DVB-3030进行了有效的检查,但是,例如,在设置频率为90 MHz时,将信号功率设置为50 dBm可能会导致违反法律,举个例子,因此违反法律将触犯用户的良心,但我想保护他们不使用修改过的文件,这会导致他们意外地违反法律。