Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确保用户只能保存在文件夹内_C#_.net_Winforms - Fatal编程技术网

C# 确保用户只能保存在文件夹内

C# 确保用户只能保存在文件夹内,c#,.net,winforms,C#,.net,Winforms,我有一个应用程序,允许用户从填充了一些数据的自定义模板导出文件,现在他们可以选择保存到的位置。如果文件已经存在,它将覆盖该文件或根据其首选项生成新名称 它将导出到的任何文件夹/文件名以及它是否会覆盖该文件(如果该文件存在),都存储在用户创建并保存的配置文件中。然后他所做的就是运行这个文件,应用程序将开始收集数据并导出这些文件 因此,危险在于我可能会向您发送一个保存到C驱动器的配置文件,而您所需要做的就是打开并运行它,如果您的C驱动器上的文件碰巧具有相同的名称,它可能会覆盖这些文件。我正在考虑的是

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

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

因此,危险在于我可能会向您发送一个保存到C驱动器的配置文件,而您所需要做的就是打开并运行它,如果您的C驱动器上的文件碰巧具有相同的名称,它可能会覆盖这些文件。我正在考虑的是让用户选择一个保存文件的文件夹,并将此首选项不存储在配置文件中,而是将其保存为用户首选项,因此如果我给您一个配置文件,此文件将导出到您选择导出到的任何文件夹。不过,配置文件将决定文件名


很容易强制他们只输入有效的文件字符作为文件名,这将排除\字符,但我希望允许他们输入子文件夹和文件名,而不是在配置文件中只输入文件名,这样他们可以更好地组织导出的文件。但如果我这样做,他们可以输入类似于…\ \something\u important.exe的内容,这将保存在用户为其导出定义的文件夹之外。您如何确保他们可以输入像\sub\subsub\myfile.txt这样的路径,而不是像..\\myfile.txt这样的路径。确保路径中没有..\string就足够了吗?有没有其他像..\这样的代码可以让他们浏览文件夹树?

我真的不明白为什么这个应用程序如此复杂,但我始终相信KISS方法保持简单和愚蠢。我还相信UI用户界面应该总是引导用户做对他有利的事情,而不是因为他尝试了不该做的事情而惩罚他

我建议您创建一个在想要的文件夹中打开的表单,该表单有一个创建新文件夹的按钮和一个类似SaveFileDialog的文本框。区别在于它不允许用户进入其他文件夹。在这种情况下,用户只能在文本框中写入文件名,您可以验证文本是否为有效名称。用户无需在文本中指定路径,因为UI将为他提供更简单的方法

这种简单的形式可以在几分钟内编程,它将像岩石一样坚固。
希望有帮助

我真的不明白为什么这个应用程序如此复杂,但我始终相信KISS方法,让它简单而愚蠢。我还相信UI用户界面应该总是引导用户做对他有利的事情,而不是因为他尝试了不该做的事情而惩罚他

我建议您创建一个在想要的文件夹中打开的表单,该表单有一个创建新文件夹的按钮和一个类似SaveFileDialog的文本框。区别在于它不允许用户进入其他文件夹。在这种情况下,用户只能在文本框中写入文件名,您可以验证文本是否为有效名称。用户无需在文本中指定路径,因为UI将为他提供更简单的方法

这种简单的形式可以在几分钟内编程,它将像岩石一样坚固。
希望有帮助

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


从拍摄的图像。

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

图片取自。

我认为您可以使用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");
我认为可以使用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");