访问路径....被拒绝

s.k*_*aul 5 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;
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*eve 8

将文件移出Program Files目录.在Win7中只适用于普通用户.

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

string dataPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
string appFile = Path.Combine(dataPath, "MyAppDir", "MyFile.txt");
Run Code Online (Sandbox Code Playgroud)

通常(在Win7上)这个结果就像这样的路径

c:\programdata\MyAppDir\MyFile.txt
Run Code Online (Sandbox Code Playgroud)

但是使用SpecialFolder枚举,您可以保证在您的应用程序中使用readwrite中可用的文件夹,而不依赖于当前的操作系统.


use*_*116 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");
Run Code Online (Sandbox Code Playgroud)

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