如何针对潜在的非正统硬盘驱动器号码进行防御性编码?

时间:2014-10-04 04:25:30

标签: c# winforms hard-drive savefiledialog program-files

我可以将SaveFileDialog的InitialDirectory属性设置为我的应用程序通常安装的位置,如下所示:

saveFileDialog1.InitialDirectory = @"C:\Program Files\Waltons\Mountains";

...但是因为“每个人群中都有一个”,有些人可能会使用C以外的驱动器号作为硬盘吗?如何将InitialDirectory设置为用户指定的任何驱动器号?

更新

我尝试了阿列克谢的代码(不得不将“Concat”更改为“Combine”并删除多余的“)”:

saveFileDialog1.InitialDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Programs), @"Waltons\Mountains");
DialogResult result = saveFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
    // TODO: Finish
}

...但它没有打开C:\ Program Files \ Waltons \ Mountains

更新2

Saeb的建议似乎有效,因为保存文件对话框在C:\ Waltons \ Mountains \ bin \ Debug

中打开

...我希望/估计对应于用户机器上的C:\ Waltons(或D:\ Waltons或Z:\ Waltons或其他)。

我想要为用户附加“\ Maps” - 检查它是否在Visual Studio中运行,或者在那个事件中追加它。

3 个答案:

答案 0 :(得分:4)

普通用户可写的位置对于保存对话框来说是更好的默认位置。即“我的文档”通过Environment.GetFolderPath传递Environment.SpecialFolder个值之一:

var pathToMyDocuments = Environment.GetFolderPath(Environment.SpecialFolder.Personal));

如果您需要默认安​​装程序的位置,如程序文件

Path.Combine(
     Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "MyFolder");

或者如果您需要相对于程序检查的路径How can I get the application's path in a .NET console application?

请注意,除非您关闭UAC或明确“以管理员身份运行”或更改这些文件夹的默认权限,否则普通用户甚至管理员都无法写入上述位置(绕过默认权限的方法有其缺点,应该执行如果允许普通用户在programs / system文件夹中写入,则需要进行严格的安全审核。

答案 1 :(得分:2)

请勿使用硬编码的驱动程序字母。在运行时中查找路径。 e.g:

saveFileDialog1.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;

答案 2 :(得分:1)

您可以使用环境变量systemroot来获取驱动器。尝试打开cmd提示符并输入set以查看所有可用环境变量的列表,然后使用System.Envrionment.GetEnvironmentVariable(“systemdrive”)并将其与路径的其余部分组合。