2014-02-28 24 views
2

我已經爲我的軟件,最後將其安裝在寫作配置文件:程序文件(x86) MyApp的 myapp.cfg,對管理員權限

C:\Program Files (x86)\MyApp\myapp.exe 
由安裝程序(使用Inno Setup的)

像往常一樣在Windows平臺上,它完美的作品。當我的軟件試圖在這裏寫它的配置文件

的問題來了:

C:\Program Files (x86)\MyApp\myapp.cfg 

這裏Permission denied錯誤到來!

我發現的唯一解決方案是「以管理員身份運行軟件」,但我不喜歡這種解決方案:我不想讓最終用戶每次都必須執行「以管理員身份運行」將使用該軟件。

是否有具有C:\Program Files (x86)\MyApp\myapp.cfg寫不要求最終用戶「以管理員身份運行」右一個乾淨的解決方案?

+3

是避免使用環境變量和SHGetFolderPath每代替意見。有一個解決方案。永遠不要將配置文件保存到應用程序文件夾!將其存儲在應用程序數據文件夾中。那一個可以寫入你的應用程序。 – TLama

+0

謝謝@TLama的回答。你知道一個文檔/教程/文檔顯示什麼是所有這些事情的良好實踐嗎?也許有一些官方的微軟文檔?此外,我正在尋找一個適用於WinXP,WinVista,Win7,Win8的解決方案:它們是否都有「應用程序數據文件夾」?最後一個問題:你知道如何獲得Python(或任何其他語言)中的「應用程序數據文件夾」路徑嗎? – Basj

+0

我已經從最後兩個問題中刪除了Inno Setup標籤,因爲它們與安裝程序本身無關。 – TLama

回答

2

正如@TLama所說,永遠不要試圖寫入應用程序文件夾。這從來不是推薦的做法,因爲微軟Vista已經禁用了它(通過首先允許你編寫,但實際上將寫入重定向到另一個目錄,在後來的OS版本中似乎已被刪除的功能 - 以及它正在製作的好東西支持地獄般)。

要檢索已知文件夾路徑,請使用SHGetFolderPath函數。根據應用程序數據是在所有用戶之間共享還是僅由運行該應用程序的用戶使用,您應分別撥打SHGetFolderPath或撥打CSIDL_COMMON_APPDATA或撥打CSIDL_LOCAL_APPDATA。避免直接在這些文件夾中書寫,但要創建子文件夾,如<your company>\<your app>,然後改用它們。

請注意,SHGetFolderPath已被棄用,並且SHGetKnownFolderPath應該用來代替它,但前提是您不需要與Vista之前的Windows版本兼容。

爲了完整起見,this thread還描述瞭如何將SHGetFolderPath導入到Python中。

更新:修正通過@RemyLebeau @TLama

+0

非常感謝。由於我想要一個所有用戶都可以訪問的地方,似乎必須使用'%ALLUSERSPROFILE%\ MyApp \ myapp.cfg'。 這將是'C:\ ProgramData \ MyApp \ myapp。WinVista/7上的cfg'(這看起來不錯),但在WinXP上是'C:\ Documents and Settings \ All Users \ MyApp \ myapp.cfg'。後者是否正確?我真的不記得WinXP,但是當我使用XP時,我從未在'C:\ Documents and Settings \ All Users \ MyApp \ myapp.cfg'中看到過配置文件。在XP上存儲配置文件(適用於所有用戶)是否是**的好地方? – Basj

+1

您不需要關心該文件夾的物理位置,也不需要對其進行硬編碼。你需要做的是按照預定義的方式找到這個位置,這是Python討論的例子。在['這個問題'](http://stackoverflow.com/q/626796/960757)。 – TLama

+1

我同意@TLama不需要知道正確的位置,只需要讓操作系統將您引導至正確的位置即可。即使對於您不希望的支持(雖然我過去也不想)告訴您的用戶向您發送信息,例如,當從C:\ Documents and Settings \ All Users \ MyApp \ myapp.log中記錄日誌時在XP或'C:\ ProgramData \ MyApp \ myapp.log'上使用Vista或更高版本。這些路徑可以改變,所以你唯一可以依賴的就是操作系統。爲應用程序本身提供用戶爲他們打開應用程序目錄。 – ierceg