确保用户只能保存在文件夹中

时间:2012-08-05 20:47:16

标签: c# .net winforms

我有一个应用程序,允许用户从填充了一些数据的自定义模板中导出文件,现在他们可以选择保存到的位置。如果文件已存在,它将覆盖它或根据其偏好生成新名称。

它将导出到哪个文件夹/文件名,如果文件存在与否,它是否会覆盖该文件存储在用户创建和保存的配置文件中。然后他所做的就是运行这个文件,应用程序将开始收集数据并导出这些文件。

所以危险在于我可以向你发送一个保存到C盘的配置文件,你需要做的就是打开并运行它,它可能会覆盖你在C盘上的文件,如果他们碰巧有相同的名字。我正在考虑做的是让用户选择一个文件夹保存文件,并将此首选项存储在配置文件中,但保存为用户首选项,所以如果我给你一个配置文件,这个文件将导出到任何您选择导出到的文件夹。但是,配置文件将确定文件名。

很容易强制他们只输入有效的文件字符作为文件名(这将排除\字符),但我想允许他们输入子文件夹和文件名而不是只输入配置文件中的文件名,以便他们可以更好地组织导出的文件。但是,如果我这样做,他们可以输入类似..\..\something_important.exe的内容,这将保存在用户为其导出定义的文件夹之外。您如何确保他们可以输入\sub\subsub\myfile.txt但不像..\..\myfile.txt的路径。是否足以确保路径中没有..\个字符串?还有其他代码如..\可以让他们在文件夹树中向上导航吗?

3 个答案:

答案 0 :(得分:2)

我建议您使用FolderBrowserDialog来允许用户选择文件夹。这是用户可能具有使用经验的常见对话框。如果您对用户可以选择的文件夹有其他规则,则可以在用户选择文件夹后执行此验证,如果用户选择了根文件夹,则拒绝该文件。

FolderBrowserDialog

(图片取自FolderBrowserDialog in C#。)

答案 1 :(得分:1)

我真的不明白为什么这个应用程序如此复杂,但我总是相信KISS方法(Keep It Simple and Stupid)。我也相信UI(用户界面)应该始终引导用户做对他有利的事情而不是惩罚他尝试不应该做的事情。

我建议你创建一个在所需文件夹中打开的表单,它有一个用于创建新文件夹的按钮和一个像SaveFileDialog这样的文本框。不同之处在于它不会让用户进入其他文件夹。在这种情况下,用户只能在文本框中写入文件名,并将文本验证为有效名称。用户无需在文本中指定路径,因为UI将为他提供更简单的方法。

这个简单的形式可以在几分钟内编程,它将是坚如磐石的。 希望它有所帮助!

答案 2 :(得分:1)

我认为您可以使用Path.GetFullPath来验证最终路径

string myRootPath = @"c:\root\subdir\";
var newPath = Path.Combine(myRootPath, @"..\..\windows\aaa"); //user enters ..\..\windows\aaa
var usersPath = Path.GetFullPath(newPath);

if (!usersPath.StartsWith(myRootPath))
    MessageBox.Show("ALERT");