文件写入权限问题“Program Files”文件夹下

我正在使用inno安装程序为我的应用程序做一个安装包,而我的应用程序是用C#+ .Net 2.0 + VSTS 2008编写的。Inno setup => http://www.jrsoftware.org/isinfo.php我安装我的Program Files / Foo文件夹下的应用程序(Foo是我的应用程序名称)。 我的应用程序是针对Windows Vista的。

我发现的问题是我的程序无法写入文件夹Program Files / Foo。 我需要写入这个文件夹的权限才能保存一些configuration文件。 我注意到的奇怪的事情是文件夹Program Files / Foo被标记为只读,并且我已经检查了Program Files下所有标记为只读的文件夹,比如Office。

我的问题是,

  1. 为什么所有文件夹都被标记为只读在程序文件下? 这意味着我们不应该写在程序文件下的单个应用程序文件夹? 如果没有,我们应该在哪里写信息到磁盘上,像用户上次select的单个应用程序的configuration信息?
  2. 如果我们可以写入程序文件下的单个应用程序文件夹,解决scheme是什么? 我不希望我的应用程序运行身份pipe理员来解决此问题,如果有解决scheme写入此文件夹,我想要尽可能最小权限。

您应该使用特殊的文件夹enum和Enivronment.GetFolderPath将用户特定的configuration数据写入当前用户的Application Data文件夹 。

最佳做法是不要将configuration数据存储在Program Files文件夹中。 而是将应用程序的数据存储在%AppData%\ YourApplicationName中。 根据您是要将每个用户的configuration数据存储在共享的公用文件夹中,请使用以下某个枚举来获取文件夹path:

string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); string commonAppData = Envrionment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

默认情况下,Vista用户不能以pipe理员身份运行程序,因此这些程序只能读取 “程序文件”下的文件夹。 用户可以通过禁用UAC来更改此行为,并且可以要求用户这样做,但在办公室设置中,用户可能没有该选项。 这就是您使用AppData的原因 – 应用程序可以随时读取写入数据到AppData文件夹。

关于UAC的信息可以在微软的网站上find。 虽然这个页面相当长,但这是了解UAC的起点: http : //msdn.microsoft.com/en-us/library/bb530410.aspx

一个常见的解决scheme是将configuration文件安装到应用程序数据文件夹,如下所示:

 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)