C#访问被拒绝到Windows应用程序中的路径

时间:2010-10-15 19:44:16

标签: c# c#-3.0

我在Windows 7上使用c#构建了一个Windows应用程序。

一切正常,所以我创建了一个安装向导项目然后构建它。安装应用程序后,我可以正确打开它,但是当我尝试执行一些写入文本文件的操作(带有日志记录)时,它会崩溃,并向我发出以下错误消息:

  

UnauthorizedAccessException

     

访问路径'C:\ Program Files   (x86)\ MSProgram \ MSProgram \ log.txt'是   拒绝。

当我手动为该文件夹提供完整权限时,它可以正常工作。现在,问题如下:

如何以编程方式授予应用程序在我的应用程序目录中编写内容的权限?因此,每个下载它的人都不会遇到同样的问题。

4 个答案:

答案 0 :(得分:20)

别。应用程序不应直接将数据写入其安装目录。这样做会使应用程序在Windows Vista和Windows 7上运行不佳,因为它不是保存数据的正确方法。

您应该使用Environment.GetFolderPath,并写入一个好的位置,例如用户的应用程序数据文件夹(Environment.SpecialFolders.ApplicationData)。

答案 1 :(得分:10)

解决方案不是向该directry授予权限,而是写入更适合应用程序日志的文件夹。 “Program Files(x86)”和“Program Files”是应用程序安装的地方,而不是日志记录。

更合适的位置是每用户数据文件夹

  • %APPDATA%
  • %LOCALAPPDATA%

或以下值Environment.GetFolderPath的结果

  • SpecialFolder.ApplicationData
  • SpecialFolder.LocalApplicationData
  • SpecialFolder.CommonApplicationData

答案 2 :(得分:3)

一般来说,写入Program Files目录并不好,我通常会将日志文件写入AppData文件夹,您可以使用以下命令获取该文件夹:

var logFilename = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "log.txt")

您可能希望在其中创建目录或为日志文件提供更具描述性的名称。您可能还想考虑是否可以为同一个用户运行多个应用实例。

如果您必须写入Program Files目录,则需要使用管理员权限运行应用程序,或者使用以管理员身份运行,或者通过请求应用程序的更高权限。另一种可能性是设置安装程序以赋予安装用户完整文件夹权限,但如何执行此操作取决于您使用的安装程序。

希望这有帮助。

安迪

答案 3 :(得分:0)

添加Reed Copsey和JaredPar在答案中所写的内容:

不建议写入“Program Files”或“Program Files(x86)”目录,这是有充分理由的。这样做的原因是授予任何应用程序写入和/或更改这些目录中的文件的权限是一个安全问题 - 它允许“危害”的程序(例如,您的浏览器,如果它有安全漏洞)来改变程序文件,用病毒或蠕虫等感染它们

Windows具有用于应用程序和用户数据的专用文件夹,并且由于对这些文件夹的安全性限制较低,因此访问这些文件夹中的数据的任何程序都应将其视为“不受信任的数据”。一个这样的文件夹是Environment.SpecialFolders.ApplicationData - 如里德所示。