2011-02-23 58 views
7

在我的應用程序中,我在每臺計算機上存儲應用程序文件夾中的一些文件。SHGetSpecialFolderPath用於檢索也可以訪問非管理員用戶的應用程序文件夾,CSIDL可以選擇哪個文件夾?

的實際情況的簡化版本是這樣的:

..\Project1\LoginHistory (login history file - common for all users) 
..\Project1\Translations (localization files - common for all users) 
..\Project1\FormSettings\User1\ (this contains an ini file per form for User1) 
..\Project1\FormSettings\UserN\ (this contains an ini file per form for UserN) 

所以你可以看到我爲什麼用這樣的:保存一些數據特定於機器(記得這臺機器作出的最新登錄,一種MRU),存儲轉換字符串或第三方組件(這些是從exe資源中提取運行時)以及用於保存某些用戶特定數據(如表單大小)。真實情況更爲複雜,但至少可以得到一些「常用文件夾」和一些「用戶文件夾」。

現在我想保持這種結構,所以我所有的文件在一個.. \ Project1文件夾(+子文件夾)中。即使因爲用戶不是Windows用戶,但他們是SQL Server用戶。

我的問題是要選擇哪個文件夾..\

目前我(成功地)使用此代碼爲retrieveing ..\

uses ShlObj; 

function GetSpecialFolder(const CSIDL: integer) : string; 
var 
    RecPath : PWideChar; 
begin 
    RecPath := StrAlloc(MAX_PATH); 
    try 
    FillChar(RecPath^, MAX_PATH, 0); 
    if SHGetSpecialFolderPath(0, RecPath, CSIDL, false) 
     then result := RecPath 
     else result := ''; 
    finally 
     StrDispose(RecPath); 
    end; 
end; 

和我一起

GetSpecialFolder(CSIDL_APPDATA) 

凡CDISL列表定義here調用它。

GetSpecialFolder(CSIDL_APPDATA)回報C:\Users\username\AppData\Roaming在Windows 7

所以這用來工作,但最近我收到一些客戶認爲似乎直接關係到閱讀這些文件夾/寫問題的一些投訴。 (例如C:\Users\username\AppData\Roaming\Project1\LoginHistory - 使用上面列出的文件夾)。

所以我的問題是:是否正確使用CSIDL_APPDATA?你有另外一個建議嗎?是否有可能在某些操作系統上或某些用戶的權限真正減少時,可能會在該文件夾上出現讀/寫問題?

請記住,我不想爲我的文件擁有多個根文件夾。

+1

用戶必須能夠在那裏寫。否則整個系統就會崩潰。在編寫文件之前,您是否需要創建丟失的目錄?如果您不告訴我們錯誤代碼和消息,很難調試這個! – 2011-02-23 11:17:27

+0

是的,如果用戶當然不能寫出整個想法不起作用。我無法重現這個問題,我只是被告知有人有這個問題,所以我試圖猜測是哪個原因。 Probabyl I將有機會進一步調查,但不是現在。這就是我問的原因。 – LaBracca 2011-02-23 14:18:41

回答

0

我最後使用的方法是正確的。因爲我並不需要用於我的應用程序的公共文件(所有臨時文件都是用戶特定的 - 因爲少數常見的東西存儲在數據庫中),這是一個很好的地方。

我面臨的問題仍然不清楚,但我懷疑這是由於login.ini是一個保留字(最近,在最近的一些Windows Update之後)。我已經詢問this question

5

我想你想使用CSIDL_COMMON_APPDATA來處理非用戶特定的文件。如果您假設(在您的代碼中)存儲在CSIDL_APPDATA中的文件是由用戶共享的,則不允許。

+0

但是你的意思是,一個「機器上沒有權限」的用戶,比方說一種「訪客」用戶可以從'CSIDL_COMMON_APPDATA'而不是'CSIDL_APPDATA'讀取寫入?我的意思是改成'CSIDL_COMMON_APPDATA'有沒有可能事情會好轉或不好?或者你建議這只是因爲「語義上」這將是一個更好的選擇(我同意你)? – LaBracca 2011-02-23 14:20:32

+0

只是爲了確認:'CSIDL_COMMON_APPDATA'是100%更好,在這裏(http://msdn.microsoft.com/en-us/library/bb762494(v=vs.85).aspx)他們也說「這個信息會不漫遊,任何人都可以使用電腦。「雖然這不是爲「CSIDL_APPDATA」編寫的。 – LaBracca 2011-02-23 14:25:50

+0

我還有一個評論:在終端服務器場景中會發生什麼?在這種情況下,更多的用戶將使用相同的文件夾,這可能是一個問題。 – LaBracca 2011-02-23 14:32:11

相關問題