【问题标题】:Access to the path .... is denied访问路径....被拒绝
【发布时间】:2012-12-18 14:15:21
【问题描述】:

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

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

【问题讨论】:

  • 手动检查文件的权限,并确保当前用户对文件有写权限。如果在创建文件时没有设置适当的权限。
  • 您不需要在帖子中包含签名 - 您的用户卡会自动添加。阅读FAQ了解更多详情。
  • @Artemix,我以后不会签名了。对不起。

标签: c# access-denied


【解决方案1】:

将您的文件移出 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 枚举,您可以保证使用可用于读写应用程序的文件夹,而不取决于当前的操作系统。

【讨论】:

    【解决方案2】:

    解决此问题的唯一方法是不写入该文件夹。按照惯例,您不能写入该文件夹,不幸的是,旧版本的 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 会告诉您,您将不得不停止在人行道上行驶并按预期使用街道。

    【讨论】:

    • 感谢您的良好合作。但这里有一个小问题—— Path.Combine() 不接受 3 个参数。它应该是 var path = Path.Combine(perUserAppData, "MyApp\\MyFile.txt");
    • It certainly does,也许你的 .Net 版本不适用。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多