“Program Files”文件夹下的文件写入权限问题
Posted
技术标签:
【中文标题】“Program Files”文件夹下的文件写入权限问题【英文标题】:file write permission issue under "Program Files" folder 【发布时间】:2010-11-14 14:01:47 【问题描述】:我正在使用 inno setup 为我的应用程序制作安装包,我的应用程序是由 C# + .Net 2.0 + VSTS 2008 编写的。 Inno setup => http://www.jrsoftware.org/isinfo.php 我将我的应用程序安装在 Program Files/Foo 文件夹下(Foo 是我的应用程序名称)。我的应用程序面向 Windows Vista。
我发现的问题是我的程序无法写入文件夹 Program Files/Foo。我需要写入这个文件夹的权限才能保存一些配置文件。我注意到奇怪的是文件夹 Program Files/Foo 被标记为只读,我检查了 Program Files 下的所有文件夹都标记为只读,例如 Office。
我的问题是,
-
为什么在 Program Files 下所有文件夹都标记为只读?这意味着我们不应该写入 Program Files 下的单个应用程序文件夹?如果没有,我们应该在哪里将信息写入磁盘,例如用户上次选择的单个应用程序的配置信息?
如果我们可以写入 Program Files 下的单个应用程序文件夹,解决方案是什么?我不希望我的应用程序以管理员身份运行来解决此问题,如果有写入此文件夹的解决方案,我希望尽可能要求最低权限。
【问题讨论】:
【参考方案1】:一种常见的解决方案是将配置文件安装到 Application Data 文件夹,即如下所示:
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
【讨论】:
Program Files下的个别应用文件夹不建议写?任何已发布的指南?【参考方案2】:您应该使用special folders enum 和Enivronment.GetFolderPath 将用户特定的配置数据写入当前用户的Application Data 文件夹。
【讨论】:
Program Files下的个别应用文件夹不建议写?任何已发布的指南? Windows XP - 应用程序指南 到处走走。 :-) 如果对于 Windows Vista,我们应该将数据存储到 AppData 中的任何已发布的最佳实践或指南? microsoft.com/downloads/…【参考方案3】:最佳实践是不要将配置数据存储在 Program Files 文件夹中。相反,将应用程序的数据存储在 %AppData%\YourApplicationName 中。根据您是要为每个用户存储配置数据还是在共享的公共文件夹中存储配置数据,请使用以下枚举之一来获取文件夹路径:
string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string commonAppData = Envrionment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
默认情况下,Vista 用户不以管理员身份运行程序,因此这些程序对“程序文件”下的文件夹具有只读权限。用户可以通过禁用 UAC 来更改此行为,您可以要求您的用户这样做,但在办公室设置中,用户可能没有该选项。这就是您改用 AppData 的原因——应用程序始终可以读取和将数据写入 AppData 文件夹。
有关 UAC 的信息可以在 Microsoft 的网站上找到。虽然这个页面相当长,但它是理解 UAC 的起点: http://msdn.microsoft.com/en-us/library/bb530410.aspx
【讨论】:
以上是关于“Program Files”文件夹下的文件写入权限问题的主要内容,如果未能解决你的问题,请参考以下文章
WIN7 c:\Program Files文件夹下没有Windows Sidebar 怎么办?
Advanced Installer读取注册表时将Program Files读取为Program Files (x86)的解决办法
Advanced Installer读取注册表时将Program Files读取为Program Files (x86)的解决办法