2009-07-28 123 views
15

我使用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。

我的问题是,

  1. 为什么所有文件夹都标记为只在Program Files文件阅读?这意味着我们不应该写入程序文件下的单个应用程序文件夹?如果不是,我们应该如何将信息写入磁盘,如用户上次选择的单个应用程序的配置信息?
  2. 如果我们可以写入程序文件下的单个应用程序文件夹,解决方案是什么?我不希望我的应用程序以“运行身份管理员”身份来解决此问题,并且如果有解决方案可以写入此文件夹,我希望尽可能要求最小权限。

回答

14

你应该写用户特定的配置数据的Application Data文件夹为当前用户使用special folders enumEnivronment.GetFolderPath

+0

程序文件下的单个应用程序文件夹不建议写入?任何公布的指导方针 – George2 2009-07-28 04:59:32

6

一个共同的解决办法是将配置文件安装到Application Data文件夹,即像如下:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 
+0

Program Files下的单个应用程序文件夹不建议写入?任何公布的指导方针 – George2 2009-07-28 04:58:59

12

最佳实践是不将配置数据存储在Program Files文件夹中。而应将应用程序的数据存储在%AppData%\ YourApplicationName中。根据您是否希望存储配置数据每用户或一个共同的文件夹,使用下列枚举之一得到的文件夹路径:

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

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

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