访问路径....被拒绝

时间:2012-12-18 14:15:21

标签: c# access-denied

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

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

3 个答案:

答案 0 :(得分: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枚举,您可以保证在您的应用程序中使用readwrite中可用的文件夹,而不依赖于当前的操作系统。

答案 1 :(得分: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告诉您,您将不得不停止在人行道上行驶并按照预期使用街道。

答案 2 :(得分:0)

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

作为一个长期修复,如果您作为非特权用户运行,则不应写入程序目录,而应该写入%LOCALAPPDATA%或%APPDATA%。