我們有一個Windows應用程序,可以將其安裝在程序文件中,也可以從其他位置複製和使用。此外,客戶經常希望使用來自同一臺機器的幾個版本的應用程序(長話短說:客戶有N個項目,每個項目都處於不同的階段,因此每個項目都需要不同版本的應用程序。客戶羣是自己的項目,位於我們的應用程序/框架)。將日誌和數據寫入某處的正確方法
我們開始看到投訴的客戶是運行我們的應用程序requries管理員權限,因爲:
- 我們寫文本日誌本地文件夾。我們也使用Windows事件作爲日誌,但文本日誌是必需的。
- 我們將DB緩存寫入本地文件夾。數據庫緩存應儘可能在應用程序運行之間持續存在。
- 我們還編寫了一些其他文件,比如僅在應用程序運行生命週期中需要的固件,並且可以在應用程序關閉時刪除。
我們決定我們應該做點什麼。可能我們應該把所有這些東西寫入%AppData%/[someFolder]
。問題是客戶可能有幾個不同的應用程序實例,他們應該有獨立的日誌/緩存。客戶甚至可能安裝了兩次相同的版本,因此我們不能使用版本作爲密鑰。
當前的想法是使用Assembly.GetEntryAssembly().Location
作爲關鍵,因此寫入的路徑將類似於$"%AppData%\{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}"
。這可能會起作用,但看起來非常怪異和黑客。
有沒有更好的方法來管理呢?我也想爲每個應用程序實例分配一個GUID並使用它,但我不確定如何正確執行此操作。
你可能會過於複雜的事情。有沒有什麼,你不能創建日誌的可執行文件位置,或在一些文件夾名爲「日誌」,「數據庫」等exe旁邊?對於只在應用程序運行時才需要的臨時文件,還有C:\ Windows \ Temp文件夾。如果你想使用AppData。使用此UID創建帶有此UID的小文件,並使用此UID在應用程序數據中創建文件夾 –
爲什麼不讓客戶選擇將數據寫入哪裏?給他們一個配置選項,讓他們處理權限。 – DavidG
@Sinatr我們有一個安裝程序,但有些客戶更喜歡複製應用程序,所以我們也支持。客戶的常規方式是運行一個instaler,安裝到Program Files並從那裏使用它。不幸的是,這意味着我們不能在那裏寫日誌,因爲這是受限制的位置。請求客戶每次以管理員身份運行它或處理UAC不是一種選擇 – Archeg