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