"Program Files"文件夹下的文件写入权限问题

Geo*_*ge2 15 .net c# permissions

我正在使用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下的所有文件夹都标有只读,如Office.

我的问题是,

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

Pau*_*enk 14

您应该使用特殊文件夹枚举Enivronment.GetFolderPath将用户特定的配置数据写入当前用户的Application Data文件.

  • http://www.microsoft.com/downloads/details.aspx?FamilyID=88AD7E7C-4068-48B8-9503-E160A6693BBA&displaylang=en (2认同)

And*_*ewS 12

最佳实践是不将配置数据存储在Program Files文件夹中.而是将应用程序的数据存储在%AppData%\ YourApplicationName中.根据您是要按用户存储配置数据还是存储在共享公用文件夹中,请使用以下枚举之一来获取文件夹路径:

string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);  
string commonAppData = Envrionment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 
Run Code Online (Sandbox Code Playgroud)

默认情况下,Vista用户以管理员身份运行程序,因此这些程序只能读取 "程序文件"下的文件夹.用户可以通过禁用UAC来更改此行为,您可以要求您的用户执行此操作,但在办公室设置中,用户可能没有该选项.这就是您使用AppData的原因 - 应用程序始终可以读取写入AppData文件夹的数据.

有关UAC的信息可以在Microsoft的站点上找到.虽然这个页面相当长,但它是理解UAC的起点:http: //msdn.microsoft.com/en-us/library/bb530410.aspx


jpo*_*poh 6

一个常见的解决方案是将配置文件安装到Application Data文件夹,如下所示:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Run Code Online (Sandbox Code Playgroud)