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

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

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

UnauthorizedAccessException

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

当我手动给该文件夹完全权限时,它工作正常。 现在,问题是:

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

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

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

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

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

  • %应用程序数据%
  • %LOCALAPPDATA%

或者Environment.GetFolderPath的结果为以下值

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

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

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

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

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

希望这可以帮助。

安迪

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

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

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