System.UnauthorizedAccessException:拒绝访问路径“...”

时间:2016-09-16 15:08:34

标签: c# wpf clickonce

我使用.net安装完成C#wpf安装。一切正常。然后我有以下代码,它是已安装程序的一部分:

String destinationPath = System.Windows.Forms.Application.StartupPath + "\\" + fileName;
File.Copy(path, destinationPath, true);
this.DialogResult = true;
this.Close();

但是我收到了这个错误:

  

System.UnauthorizedAccessException:访问路径C:\ user \ pc \ appdata \ local \ apps \ 2.0 .......被拒绝。

     

at System.IO.File.InternalCopy(String sourceFileName,String destFileName,Boolean overwrite,Boolean checkHost)         在System.IO.File.Copy(String sourceFileName,String destFileName,Boolean overwrite)

是权限错误还是我需要在代码中调整某些内容?

让我感到困惑的是,为什么用户能够使用点击一次进入该目录而没有任何问题来安装程序,但是将文件上传到它不起作用?

4 个答案:

答案 0 :(得分:7)

安装应用程序时,安装程​​序通常会要求管理权限。如果用户选择“是”,则程序将运行并具有比普通用户具有的更多种路径的读写访问权限。如果情况是安装程序没有要求管理权限,则可能只是ClickOnce在某种提升权限下自动运行。

我建议您改为写入本地appdata文件夹,但如果您认为您真的想要写入与应用程序完全相同的目录,则必须先使用管理员权限运行您的应用程序。

要让您的应用程序始终要求管理员权限,您可以修改应用的清单文件,并将requestedExecutionLevel代码的level属性设置为requireAdministrator

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

您可以在How do I force my .NET application to run as administrator?

中多阅读一下

答案 1 :(得分:1)

首先,如果您需要编写任何数据,则应使用Environment.SpecialFolder枚举。

其次,不要写入部署应用程序的任何文件夹,因为它通常只读取应用程序。您可能希望写入ApplicationDataLocalApplicationData枚举。

答案 2 :(得分:1)

我认为默认情况下,在Windows 8(或7)之后限制访问%appdata%。 当通过ClickOnce安装应用程序时,可能会提示您授予其更改此计算机的权限 - 是吗?

您可以尝试运行具有管理员权限的应用程序作为测试(按住Shift键,右键单击.exe,以管理员身份运行),这可能会解决它,但这不是理想的方法。

而是尝试另一个文件夹,例如:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments )

这应该会给你更好的运气。

作为旁注 - 如果您在代码中构建路径,而不是使用

path + "\\" + path + "\\" + filename 

哪个容易出现故障(路径可能已经有一个\),通常最好使用Path.Combine(..)

String destinationPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), fileName);
祝你好运!

答案 3 :(得分:1)

我正在运行一个会生成文件的程序。目标文件夹是只读的。它会因错误而崩溃。使用文件夹属性删除只读属性解决了错误。希望这会有所帮助。