從XP開始,多出了一套叫ApplicationData的目錄,由于是NT內核及多用戶的引用,因此在沒有管理員權限的帳號打開安裝過的程序時,應用程序是無法寫入自己的目錄的,因此早期的一些程序會因此遇到一些故障.
解決這個問題的方法是獲取ApplicationData的目錄位置,根據自己應用程序的名稱創建配置文件.
這些網上都能搜到,主要是使用SHGetFolderPath的API,這里要說下 int csidl這個參數的幾個區別:
CSIDL_COMMON_APPDATA 所有用戶都可以使用的應用程序配置,映射All Users\Application Data
CSIDL_APPDATA 指定用戶使用的應用程序配置,并且可以通過域同步漫游的,映射<user name>\Application Data
CSIDL_LOCAL_APPDATA 本機使用,不能漫游的應用程序配置,映射<user name>\Local Settings\Applicaiton Data
另外,由于這些路徑使用起來并不方便,因此一般我們還是習慣在應用程序下存儲配置文件,這就涉及一個檢測是否應用程序文件夾有寫權限的問題.
我嘗試過:
int _waccess(
const wchar_t *path,
int mode
);
MSDN里說這個函數可以用于判定一個文件夾是否有寫權限,但是實際測試中,這個函數對于有權限控制的文件夾毫無作用,始終返回可寫.
因此,最笨的方法,依然是直接在應用程序目錄下創建一個臨時文件,創建成功說明可寫,然后再刪除這個文件(好惡心的方法).不過話又說回來,這是C時代的函數,應該不會做太多平臺相關的判斷.