2016-09-16 714 views
5

我使用.net使用点击一次安装完成C#wpf安装。一切正常。然后,我有以下的代码是安装的程序的一部分:System.UnauthorizedAccessException:对路径“...”的访问被拒绝

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

但我得到这个错误:

System.UnauthorizedAccessException: Access to the path C:\user\pc\appdata\local\apps\2.0....... is denied.

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

它是一个权限错误或者我需要在我的代码来调整的东西吗?

令我百思不解的是,为什么用户能够安装使用点击一次到该目录中没有任何问题,但文件上载到它不工作的程序?

+0

你的目标环境是什么?你有多少控制权?这是针对企业组织还是个人使用? –

+0

我的目标是更多的个人使用,但它也可以在企业上。 – user5313398

+1

停止尝试将文件复制到应用程序文件夹,如果用户修复或重新安装应用程序,则可以替换该文件夹。改为使用'ApplicationData'。 –

回答

1

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

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

+0

@jb我需要将许可证文件加载到应用程序的安装位置?那么我可以做什么最好的方式呢? – user5313398

+0

@ user5313398这是不可能的,除非用户能够提高权限 –

+0

但为什么它的工作是除了这一个许多其他电脑? – user5313398

1

我认为访问%APPDATA%上默认窗口8(或7)起限制。 当通过ClickOnce安装应用程序时,您可能会提示您允许更改此计算机 - 是吗?

你可以尝试运行与管理权限的应用程序作为测试(按住Shift键,右键单击该.exe文件,以管理员身份运行),这可能会解决这个问题,但它不是做一个理想的方式。

而是尝试另一个文件夹,这样的:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 

这应该给你更好的运气。

作为一个侧面说明 - 如果你正在构建的路径中的代码,而不是使用

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

这是容易出现的故障(路径可能已经在年底\),它通常是更好地使用路径.Combine(..)

String destinationPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), fileName); 

祝你好运!

+0

我需要将许可证文件加载到应用程序的安装位置?那么我可以做什么最好的方式呢? – user5313398

6

安装应用程序时,安装程​​序通常会要求管理权限。如果用户选择“是”,则该程序将运行并且具有对正常用户所具有的各种路径的读取和写入访问。如果情况是安装程序没有要求管理权限,那么ClickOnce可能会自动以某种提升的权限运行。

我建议你写的本地应用程序数据文件夹,而不是,但如果你觉得你真的想写信给非常相同的目录作为您的应用程序,您必须首先以管理员权限运行你的应用程序。

为了使应用程序总是要求管理员权限,可以修改您的应用程序的清单文件,并设置requestedExecutionLevel标签的level属性requireAdministrator

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

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

+0

@VisualVicent我选择Clickonce是因为它不需要额外的权限设置吗?它适用于许多其他电脑,除了这个特殊的问题。好吧,我跟着你的链接,目前我添加了新的清单文件,目前的设置是这个所以我只是改变 user5313398

+0

@ user5313398:'我选择Clickonce是因为它不需要额外的权限设置吗?' - 我对ClickOnce不是很熟悉,但是您的应用程序很可能不会以ClickOnce的相同权限运行安装程序。那是微软的愚蠢行为,因为谁知道你的应用需要什么特权? –

+0

@ user5313398:是的,您只需更改已存在的'requestedExecutionLevel'标签。 –

1

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

相关问题