9.特殊目录获取

一、前言

如果你对各种软件安装目录有所观察的话,应该能大致看出来windows电脑的某些目录是有特殊用途的。

比如最常见的安装应用程序的默认目录为:C:\Program file

这样的目录有很多,本章主要就是介绍如何获取到这个默认目录,并将其封装成代码方便使用。

二、方法

其实方法很简单,这些特殊目录都是windows实现规定好的,我们只需要通过一个win API函数就能获取,其所在头文件为:

#include<ShlObj.h>

函数为:SHGetSpecialFolderPathW

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;
}

之所以没将其封装为返回值,也是为了能够重载,毕竟只依靠返回值不同,上面两个函数是无法重载的。

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux