从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时代的函数,应该不会做太多平台相关的判断.