OpenFileDialog & SaveFileDialog 在 C# 中使用过滤器弹出搜索
OpenFileDialog & SaveFileDialog Pop-up search with filter in C#
我有带过滤器的 openFileDialog 和 saveFileDialog(只有 .dvbcfg 扩展):
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "DVB Configuration File (*.dvbcfg)|*.dvbcfg";
saveFileDialog.DefaultExt = "dvbcfg";
saveFileDialog.AddExtension = true;
它工作正常,但是当我尝试手动输入文件名时,它显示具有任何扩展名的文件 w/o 过滤和 opens/saves 它们(第一个 - 打开文件,第二个 - 保存文件):
ScreenShot
如何显示只个匹配saveFileDialog.Filter的文件?
P.S。我在 saveFileDialog.
中有覆盖功能
UPD 我还有另一个选择——当用户选择错误的文件类型时抛出异常,但我不知道如何从 [=38 中获取文件扩展名=] 字符串.
在某个时候,您必须 "trust" 您的用户。您可以 引导 他们以良好的方式使用您的程序,但在某个时候,您必须认识到您已经投入足够的 简单防止意外误用的障碍1,但您不太可能(在这些对话框中)创建足够的障碍来防止恶意误用。
The problem is that using wrong file may cause damage to expensive equipment (DVB-3030 Digital Modulator in this case) even if I'm using try/catch to get variables from files (they need to be integers, in try segment I have Convert.ToInteger32
) and variable ranges in if/else checks (for example Frequency range should be 10MHz - 90 MHz with 100Hz step). Since program will be used by students, they can purposely try to break it.
并且您当前的问题(或寻求的答案)中的任何内容都不会阻止某人重命名任何任意文件以具有 .dvbcfg
扩展名。
此时,您 "trust" 用户已经为您提供了他们希望使用的文件名。接下来需要做的是验证文件的内容。如果它具有 .dvbcfg
扩展名但实际上不是有效的 DVB 配置文件,则您需要拒绝它。如果它没有 .dvbcfg
扩展名(嘿,也许他们正在使用只允许 8.3 文件名的旧文件系统 :-))但事实证明具有有效内容,为什么要粗鲁和 拒绝那个文件?
我建议的不仅仅是将 ToInteger32
调用包装在 try
/catch
中。浏览文件。确保它包含它应该包含的内容,没有其他内容。阅读每个参数值,并可能在这些值上使用 TryParse
。因为您的代码现在 "expects" 接收无效输入。然后验证范围等
1我会说你已经得到了。
我有带过滤器的 openFileDialog 和 saveFileDialog(只有 .dvbcfg 扩展):
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "DVB Configuration File (*.dvbcfg)|*.dvbcfg";
saveFileDialog.DefaultExt = "dvbcfg";
saveFileDialog.AddExtension = true;
它工作正常,但是当我尝试手动输入文件名时,它显示具有任何扩展名的文件 w/o 过滤和 opens/saves 它们(第一个 - 打开文件,第二个 - 保存文件): ScreenShot
如何显示只个匹配saveFileDialog.Filter的文件?
P.S。我在 saveFileDialog.
中有覆盖功能UPD 我还有另一个选择——当用户选择错误的文件类型时抛出异常,但我不知道如何从 [=38 中获取文件扩展名=] 字符串.
在某个时候,您必须 "trust" 您的用户。您可以 引导 他们以良好的方式使用您的程序,但在某个时候,您必须认识到您已经投入足够的 简单防止意外误用的障碍1,但您不太可能(在这些对话框中)创建足够的障碍来防止恶意误用。
The problem is that using wrong file may cause damage to expensive equipment (DVB-3030 Digital Modulator in this case) even if I'm using try/catch to get variables from files (they need to be integers, in try segment I have
Convert.ToInteger32
) and variable ranges in if/else checks (for example Frequency range should be 10MHz - 90 MHz with 100Hz step). Since program will be used by students, they can purposely try to break it.
并且您当前的问题(或寻求的答案)中的任何内容都不会阻止某人重命名任何任意文件以具有 .dvbcfg
扩展名。
此时,您 "trust" 用户已经为您提供了他们希望使用的文件名。接下来需要做的是验证文件的内容。如果它具有 .dvbcfg
扩展名但实际上不是有效的 DVB 配置文件,则您需要拒绝它。如果它没有 .dvbcfg
扩展名(嘿,也许他们正在使用只允许 8.3 文件名的旧文件系统 :-))但事实证明具有有效内容,为什么要粗鲁和 拒绝那个文件?
我建议的不仅仅是将 ToInteger32
调用包装在 try
/catch
中。浏览文件。确保它包含它应该包含的内容,没有其他内容。阅读每个参数值,并可能在这些值上使用 TryParse
。因为您的代码现在 "expects" 接收无效输入。然后验证范围等
1我会说你已经得到了。