2010-04-23 107 views
9

我有一個C#應用程序創建自己的設置文件來存儲某些視覺元素的當前狀態。這款應用程序在沒有運行Windows 7的機器上工作得很好,但在這些機器上,我們得到一個錯誤,即由於用戶沒有權限而無法創建設置文件。現在,我可以通過訪問每臺計算機來解決這個問題,以管理員身份登錄,併爲用戶提供對我們安裝的應用程序的程序文件夾的讀寫權限,但必須有更好的方法。爲什麼我的C#應用​​程序不能在Windows 7中創建文件?

它看起來像在XP中,你有默認情況下創建的文件夾的寫入權限,但現在不是這樣了。有沒有我需要在安裝程序包中進行設置的設置?

+0

您是否檢查過安裝程序包是否將可設置的目錄標記爲可寫,並將其分配給正確的用戶? – AlG 2010-04-23 15:58:01

+2

你不說你在哪裏創建文件,這可能是有用的信息 – 2010-04-23 15:58:12

回答

19

問題是您不應該將設置文件存儲在程序文件夾中。微軟長期以來一直反對這一做法,但開始對Vista IIRC採取更嚴格的措施。

使用Environment.SpecialFolders.ApplicationData(等)找到最適合放置設置的地方。或者使用.NET設置基礎設施爲您自動執行此操作。

+2

謝謝,我知道我在做一些根本錯誤的事情。我一直在程序文件夾中存儲數據多年,這只是一種習慣的力量。我切換到在應用程序數據中創建自己的文件夾,一切正常。 – 2010-04-23 16:42:50

7

你試圖在安裝文件夾中創建文件嗎?您應該使用用戶數據文件夾中的數據而不是安裝文件夾。使用Environment.SpecialFolders.ApplicationData文件夾獲取您可以寫入的文件夾。

4

您可能在非Windows 7計算機上以管理員身份運行,該計算機可以隨處寫入。請務必將任何每個用戶實例數據保存在其AppData文件夾中(如果應該從計算機到計算機遵循這些漫遊,或者本地緩存或僅本地到本地計算機)。如果您需要在用戶之間共享設置,請使用具有適當權限的C:\ ProgramData文件夾。

程序不應該嘗試將設置存儲在其安裝目錄中。

請務必使用SpecialFolders以及Environment.GetFolderPath以獲得所需的正確位置。你不應該硬編碼路徑,因爲它們在版本和語言之間可能不同。 (我在XP的德語版知道不是Program FilesProgramme!)

2

這是在你的程序中的安全漏洞,因爲你的程序到程序目錄中寫入信息(這是,而且應該受到保護。 )如果是糾正根本原因的情況,請考慮使用SpecialFolder enumerationApplication上的靜態成員(如CommonAppDataPath)將您的信息寫入更合適的位置。

假設通過路徑編寫文件的典型方法,這是一個微不足道的修復,沒有很好的「權宜之計」理由來糾正根本原因。如果您不確定如何操作路徑,請考慮使用Path.Combine()。它爲你做到了。

2

通常,您不應該將程序數據寫入程序文件下的任何文件夾(即使您創建了該文件夾)。您應該使用Environment.GetFolderPath(...)來確定應用程序特定數據的放置位置。您可以在定義here許多枚舉一個傳遞 - 你可能想Environtment.SpecialFolder.CommonApplicationData

3

這個程序工作得很好,不是運行在Windows 7

錯誤在任何機器上!如果以管理員運行,它只適用於那些機器。我想你會發現你的程序在Windows XP上被破壞了,如果你試圖在任何商業計算機上運行它而不是在家裏的計算機上。

相反,這種信息需要放入其中一個特殊的應用程序數據文件夾中。

2
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); 
-1

我不明白這是如何作爲行爲的答案。我需要能夠編寫一份報告,並將它保存在用戶文檔文件夾中,該文件夾與用於讀取我正在編寫報告的xml文件的文件夾相同。

+0

所以你寫了一個*答案*就是這麼說的?請使用評論或提出一個新問題(是的,你仍然無法訪問評論,你需要提供一些真正的答案或先問好問題才能獲得代表) – Leeor 2013-11-07 20:09:37

相關問題