5

我使用 VS2008 安装项目创建了一个 .msi。我的应用程序经常在应用程序目录 (C:\Program Files\MyApp\MyFile.txt) 的 .txt 文件中写入一些值。在 Win7 中安装后,它会引发异常“访问路径......被拒绝”。

但是每当我以管理员身份运行它时,都不会发生此类异常。这是我的sscce

string FilePath=Application.StartupPath + @"\AppSettings\CurrentUserName.inf";
using (StreamWriter writer=new StreamWriter(FilePath,false))
{
    writer.Write(txtLoginName.Text.Trim());
}
MainForm.ProcessLogIn();
this.DialogResult = DialogResult.OK;

我不知道如何解决这个问题。有什么建议吗?

4

3 回答 3

8

将您的文件移出 Program Files 目录。在 Win7 中对于普通用户是只读的。

您可以在 ProgramData 目录中移动文件。
您的安装程序应该在那里为您的应用程序创建一个目录。
然后在您的代码中,您可以使用这些代码行检索正确的完整路径名

string dataPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
string appFile = Path.Combine(dataPath, "MyAppDir", "MyFile.txt");

通常(在Win7上)这会导致这样的路径

c:\programdata\MyAppDir\MyFile.txt

但是使用SpecialFolder枚举,您可以保证使用可用于读写应用程序的文件夹,而不取决于当前的操作系统。

于 2012-12-18T14:19:18.057 回答
5

解决此问题的唯一方法是不写入该文件夹。按照惯例,您不允许写入该文件夹,不幸的是,旧版本的 Windows 不会让您这样做。

相反,您可以使用它Environment.SpecialFolder来帮助您找到需要去的地方:

// your application data for just that User running the app
var perUserAppData = Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData);

// your application data for ALL users running the app
var allUsersAppData = Environment.GetFolderPath(
    Environment.SpecialFolder.CommonApplicationData);

// better!
var path = Path.Combine(perUserAppData, @"MyApp\MyFile.txt");

基本上,Windows 7 告诉您,您将不得不停止在人行道上行驶并按预期使用街道。

于 2012-12-18T14:20:55.983 回答
0

作为短期修复,您可以使用 ICACLS 授予对文件的写访问权限。注意:不是整个目录。

作为长期修复,如果您以非特权用户身份运行,则不应写入程序目录,而应写入 %LOCALAPPDATA% 或 %APPDATA% 之类的位置。

于 2012-12-18T14:20:19.617 回答