2017-03-08 64 views
1

我們有一個Windows應用程序,可以將其安裝在程序文件中,也可以從其他位置複製和使用。此外,客戶經常希望使用來自同一臺機器的幾個版本的應用程序(長話短說:客戶有N個項目,每個項目都處於不同的階段,因此每個項目都需要不同版本的應用程序。客戶羣是自己的項目,位於我們的應用程序/框架)。將日誌和數據寫入某處的正確方法

我們開始看到投訴的客戶是運行我們的應用程序requries管理員權限,因爲:

  • 我們寫文本日誌本地文件夾。我們也使用Windows事件作爲日誌,但文本日誌是必需的。
  • 我們將DB緩存寫入本地文件夾。數據庫緩存應儘可能在應用程序運行之間持續存在。
  • 我們還編寫了一些其他文件,比如僅在應用程序運行生命週期中需要的固件,並且可以在應用程序關閉時刪除。

我們決定我們應該做點什麼。可能我們應該把所有這些東西寫入%AppData%/[someFolder]。問題是客戶可能有幾個不同的應用程序實例,他們應該有獨立的日誌/緩存。客戶甚至可能安裝了兩次相同的版本,因此我們不能使用版本作爲密鑰。

當前的想法是使用Assembly.GetEntryAssembly().Location作爲關鍵,因此寫入的路徑將類似於$"%AppData%\{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}"。這可能會起作用,但看起來非常怪異和黑客。

有沒有更好的方法來管理呢?我也想爲每個應用程序實例分配一個GUID並使用它,但我不確定如何正確執行此操作。

+0

你可能會過於複雜的事情。有沒有什麼,你不能創建日誌的可執行文件位置,或在一些文件夾名爲「日誌」,「數據庫」等exe旁邊?對於只在應用程序運行時才需要的臨時文件,還有C:\ Windows \ Temp文件夾。如果你想使用AppData。使用此UID創建帶有此UID的小文件,並使用此UID在應用程序數據中創建文件夾 –

+0

爲什麼不讓客戶選擇將數據寫入哪裏?給他們一個配置選項,讓他們處理權限。 – DavidG

+0

@Sinatr我們有一個安裝程序,但有些客戶更喜歡複製應用程序,所以我們也支持。客戶的常規方式是運行一個instaler,安裝到Program Files並從那裏使用它。不幸的是,這意味着我們不能在那裏寫日誌,因爲這是受限制的位置。請求客戶每次以管理員身份運行它或處理UAC不是一種選擇 – Archeg

回答

1

寫入c:\Program FilesC:\Company Name都不是好主意,並與Windows最佳實踐相沖突。寫入程序文件需要管理員權限,這是有原因的!寫入C:\Company Name是可能的,但僅出於向後兼容性的原因,並且完全過時。 我的建議是寫Appdata,無論是.\Local.\LocalLow.\Roaming是你的選擇,但也有最佳實踐(read this post) 您還可以使用%Programdata%\YourFolderName

爲了保持你的程序實例彼此分開:以任一進程ID(這些在任何給定時間是唯一的,但不是隨着時間的推移),或使用隨機數。一個GUID是一個隨機數(或隨機字符串)的例子,但是如果一個GUID對你來說看起來很醜,一個4字節(long)的隨機數也可以完成這項工作。

1

我決定把我的意見放到答案中,因爲它們已經是一些人的想法的結果(你似乎正在做)。

相對文件夾是比較容易的方式解決辦法,如果你安裝的同時軟件的多個版本,那麼你不應該有衝突(假設它們都具有不同的基礎文件夾)或混淆這魔女是

C:\Company Name\Software Name 1.0 
C:\Company Name\Software Name 1.1 
C:\Company Name\Software Name 2.1 
D:\Test\Blablabla 

這將是很容易找到軟件可執行文件和相應的數據。我個人不喜歡AppData想法(既:開發者和用戶),主要表現爲它引入了混亂,因爲軟件A可能突然存儲在

c:\Users\Current User\AppData\LocalOrLocalLowOrRoamingTryToGuessWhich\SomeWeirdFolderNameToExampleB 

通常,它是一個安裝工作​​,檢查Windows版本,請檢查文件夾權限的數據,以確保應用程序具有正確的環境,但軟件在啓動時也可以做到這一點,至少在無法滿足成功運行的條件時發出警告。

在我們公司的軟件安裝程序默認提供C:\Company Name\Software Name Version文件夾,這對我們的客戶是好的。

如果您必須使用Program Files(因爲這當然不壞),那麼例如Steam客戶端會做一些事情,使其文件夾內Program Files可寫。

+0

感謝您的回答!我已經與我們的IT討論過這個問題,他們堅持我們應該使用'%ProgramData%'。他們在Windows 10上看到了很多權限問題,包括'C:\ Company Name'和'%ProgramFiles%'。看起來在Windows 10中,這變得比以前更糟。我認爲我們的方法是在'%ProgramData%'下使用'GUID',或者''DbName' +'Version'。我們仍在考慮這兩種選擇 – Archeg