在Windows 7 / Vista中编写驱动器C:

时间:2009-11-09 21:45:59

标签: c# windows-7 uac appsettings

我正在开发一个将其设置保存在安装文件夹中的应用程序。如果我在驱动器C:上的Program Files中安装应用程序并尝试编写设置文件,我会得到一个例外,就是这样。

我知道用户帐户控制(UAC)migth是不允许我的应用修改文件内容的那个。

我需要帮助解决以下问题:

  • 以至少应显示UAC警告的方式进行文件编辑,如果我回答是,则文件变为可写
  • 如果没有办法在驱动器C上编辑文件:我需要一种存储数据的方法

更通用的问题是:

如何创建一个C#程序,将其安装到Windows Vista下的C:\ Program Files \ MyProgram后,可以在安装目录中操作(创建/编辑/删除).ini文件?所有用户都应该使用此文件。

5 个答案:

答案 0 :(得分:9)

为什么不将设置存储在用户特定的位置,例如C:\Users\Username\AppData

这样,不同的用户可以在同一台机器上拥有不同的设置。此外,这是设置等的推荐位置。

答案 1 :(得分:5)

根据Ben S的回答,查看Environment.GetFolderPath方法。

此方法允许您抽象出特定位置,而只是使用已知的SpecialFolder路径(即SpecialFolder.ApplicationData)。

答案 2 :(得分:2)

您获得异常的事实意味着您的程序以某种方式识别Vista / 7。我不完全确定什么设置(在C#项目中)会触发它。但是,如果你可以让你的应用程序'假装'它是一个XP应用程序,Vista将让它写入位于其他地方的影子文件。

所有用户共享可写路径的正确方法是:

string path = Environment.GetFolderPath(
    Environment.SpecialFolder.CommonApplicationData);

答案 3 :(得分:1)

我很惊讶它尚未被提及,但一个可行的C#选项是抛弃INI文件(yuck)并拥抱Settings facilities provided by .Net。它们在所有Windows版本中都能很好地工作,它们直接由Visual Studio支持,最后它们在用户和机器级别都可以覆盖。

我们没有真正的问题可以谈论利用此功能(包括XCopy部署,已安装的应用程序,Citrix等)。

答案 4 :(得分:1)

根据Ben S和akmad的答案,您应该将ini文件放在appDataFolder中。

如果您希望设置对每个用户都是唯一的,请为每个用户创建一个ini文件并将其放在AppData文件夹中,该文件夹可以使用以下代码检索:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

如果您希望设置对所有用户都是通用的,但是普通AppData文件夹中的ini文件。

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)