2012-12-05 108 views
2

我有一個應用程序,我想將一些原始文件保存在客戶端計算機上的文件夾結構中。這個EXE是完全獨立的,可以從CD運行,或者從只讀位置運行。因此,我無法將我的數據保存在EXE位置。我想基本上「問」Windows我應該保存文件,或將它們保存在適當的位置。我應該在哪裏保存一個半臨時數據庫?

我應該在哪裏將這些數據永久保存在客戶端計算機上,但尚未存儲在應用程序通常存儲其數據的位置?由於此應用程序沒有安裝程序,因此我不知道某些程序數據文件夾的權限如何解決。我需要一個爲我的應用程序生成通用路徑的示例。運行在同一臺計算機上的任何應用程序實例都應該知道在這個專用位置查找此數據。

PS - 我的意思是半臨時數據庫,因爲數據庫有望在很長一段時間內保持機密,但有可能會被刪除以清理,在這種情況下,它會自動創建一個新的數據庫。其自身的數據可以被認爲是緩存。

編輯

至於Windows用戶會話,這是爲了對任何Windows會話的全局位置,而這個應用程序實際上是將在會話0

+0

你知道,你在這個用例中的應用程序 - 沒有安裝 - 需要管理員權限? –

+1

我從來沒有見過從CD運行的服務。你如何開始? –

+0

@UweRaabe它可以編譯爲服務和Windows應用程序,它可以以任何方式運行。 –

回答

5

參考運行服務MSDN CSIDL listing並使用SHGetFolderPath() function

將CSIDL CSIDL_COMMON_APPDATA映射到物理目錄。

從MSDN:

包含所有 用戶的應用程序數據的文件系統目錄。一個典型的路徑是C:\ Documents and Settings \ All Users \ Application Data。該文件夾用於 不是用戶特定的應用程序數據。例如,應用程序可以存儲 拼寫檢查字典,剪貼畫的數據庫,或在 CSIDL_COMMON_APPDATA文件夾中的日誌文件。此信息不會漫遊,並且 可供任何使用該計算機的人使用。

這個目錄下,創建一個供應商(公司)命名的目錄,並在其下方,爲您的應用程序的目錄。然後把你的數據庫放在那裏。

注意:請勿使用CSIDL_COMMON_DOCUMENTS/FOLDERID_PublicDocuments。這適用於可以在不同應用程序之間共享的類文檔文件。對於專有數據,如數據庫,請使用CSIDL_COMMON_APPDATA。在CSIDL_COMMON_DOCUMENTS也文件可能被「漫遊」操作系統 - 你肯定不希望的臨時數據庫的東西。

注意:對於Vista以後使用SHGetKnownFolderPath(),但對於XP或跨版本,請使用SHGetFolderPath()。

+1

的安全性,最初需要授予'CSIDL_COMMON_APPDATA \ '修改權限。 – kobik

+0

@kobik:好點。 –

2

既然你正在談論的臨時數據,最明顯的路徑將是Windows臨時目錄:

function GetTempDirectory: String; 
var 
    TempFolder: array[0..MAX_PATH] of Char; 
begin 
    GetTempPathW(MAX_PATH, @TempFolder); 
    Result := TempFolder; 
end; 

請務必讓你的文件打開,只要應用程序是活動的,所以用戶可以每當他決定清理臨時目錄時,都不會刪除文件。

+0

這是我的第一個想法,但我打算即使在重新啓動計算機時也要保留這些文件。 –

+1

但這只是用戶臨時文件夾,只有該用戶可以讀取/寫入數據。任何實例不限於只有一個用戶...也許這個問題不明確這 –

+1

@JerryDodge當重新啓動時,如果你沒有刪除它們,臨時文件夾的內容會保留在原地......最新問題 –

相關問題