我使用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;
我不知道如何解决这个问题。有什么建议吗?
答案 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%。