2016-09-16 710 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

我讀多一點正在運行一個將生成文件的程序。目標文件夾是隻讀的。它會因錯誤而崩潰。使用文件夾屬性刪除只讀屬性解決了錯誤。希望這可以幫助。

相關問題