一、前言
如果你对各种软件安装目录有所观察的话,应该能大致看出来windows电脑的某些目录是有特殊用途的。
比如最常见的安装应用程序的默认目录为:C:\Program file
。
这样的目录有很多,本章主要就是介绍如何获取到这个默认目录,并将其封装成代码方便使用。
二、方法
其实方法很简单,这些特殊目录都是windows实现规定好的,我们只需要通过一个win API函数就能获取,其所在头文件为:
#include<ShlObj.h>
BOOL SHGetSpecialFolderPathW(
HWND hwnd,
[out] LPWSTR pszPath,
[in] int csidl,
[in] BOOL fCreate
);
它有四个参数:
hwnd
:为保留参数,填0即可。pszPath
:为缓存区,用于存放查询到的路径。csidl
:标识符,就是你想要查询什么路径,可以点击这里查看。fCreate
:如果这个目录不存在,你创不创建它。
整体来说,这个函数是非常简单的,唯一比较麻烦就是第三个参数,所以我将常见的路径获取代码封装了一下,可以直接用下面的代码获取,非常方便!
三、源码
#include<ShlObj.h>
enum class PType {
Desktop= CSIDL_DESKTOP,//桌面路径
Program= CSIDL_PROGRAMS, //Start Menu\Programs,开始菜单目录
Document= CSIDL_MYDOCUMENTS, //用户文档路径
Fonts= CSIDL_FONTS, //字体目录
AppData= CSIDL_APPDATA, //存放用用数据的目录(一般存放应用程序的配置文件、日志等等)
ProgramFiles= CSIDL_PROGRAM_FILES, //应用程序的安装目录
UserProfile= CSIDL_PROFILE, //当前用户目录
Resourec= CSIDL_RESOURCES, //电脑资源目录
Windows= CSIDL_WINDOWS, //windows目录
System= CSIDL_SYSTEM, //系统目录
Startup= CSIDL_STARTUP, //存放开机启动程序的目录,电脑启动后会自动运行该目录下的可执行文件
Music= CSIDL_MYMUSIC, //音乐目录
Video= CSIDL_MYVIDEO, //视频目录
InternetCache= CSIDL_INTERNET_CACHE, //网络缓存目录
};
bool get_special_path(std::wstring& path, PType type) {
wchar_t buf[MAX_PATH]{};
BOOL ret=SHGetSpecialFolderPathW(NULL, buf, (int)type, 0);
if (!ret) return false;
path = buf;
return true;
}
四、使用实例
使用很简单:
int main()
{
wstring path;
get_special_path(path, PType::InternetCache);
wcout << path;
}
由于代码封装的宽字节版本,所以要用wcout
输出,当然你也可以修改为窄字节版本,难度并不大。
bool get_special_path(std::string& path, PType type) {
char buf[MAX_PATH]{};
BOOL ret=SHGetSpecialFolderPathA(NULL, buf, (int)type, 0);
if (!ret) return false;
path = buf;
return true;
}
之所以没将其封装为返回值,也是为了能够重载,毕竟只依靠返回值不同,上面两个函数是无法重载的。