c++ 获取当前用户的根目录

2024-05-26 01:38

本文主要是介绍c++ 获取当前用户的根目录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这个需求也是在最近开发的时候遇到的,起因是mkdir函数在创建文件夹的时候只能根据绝对路径创建,而这个绝对路径是不识别 ~  这样的符号的,也就是我们在linux下常用的基于~符号实现当前用户根目录定位无效,(注意   目前只发现这个函数不识别这个符号,而其他文件操作都是接受~标识符的)


在查找资料的时候发现 我们可以利用系统的环境变量来搞定这个需求,解决方案如下,我们在使用mkdir之前使用以下函数对路径进行转义

std::string expand_user(std::string path) {if (not path.empty() and path[0] == '~') {assert(path.size() == 1 or path[1] == '/');  // or other error handlingchar const* home = getenv("HOME");if (home or ((home = getenv("USERPROFILE"))) {path.replace(0, 1, home);}else {char const *hdrive = getenv("HOMEDRIVE"),*hpath = getenv("HOMEPATH");assert(hdrive);  // or other error handlingassert(hpath);path.replace(0, 1, std::string(hdrive) + hpath);}}return path;
}


解决方案来自于 http://stackoverflow.com/questions/4891006/how-to-create-a-folder-in-the-home-directory


原文


Use getenv to get environment variables, including HOME. If you don't know for sure if they might be present, you'll have to parse the string looking for them.

You could also use the system shell and echo to let the shell do this for you.

Getenv is portable (from standard C), but using the shell to do this portably will be harder between *nix and Windows. Convention for environment variables differs between *nix and Windows too, but presumably the string is a configuration parameter that can be modified for the given platform.

If you only need to support expanding home directories rather than arbitrary environment variables, you can use the "~" convention and then "~/somedir" for your configuration strings:

std::string expand_user(std::string path) {if (not path.empty() and path[0] == '~') {assert(path.size() == 1 or path[1] == '/');  // or other error handlingchar const* home = getenv("HOME");if (home or ((home = getenv("USERPROFILE"))) {path.replace(0, 1, home);}else {char const *hdrive = getenv("HOMEDRIVE"),*hpath = getenv("HOMEPATH");assert(hdrive);  // or other error handlingassert(hpath);path.replace(0, 1, std::string(hdrive) + hpath);}}return path;
}

This behavior is copied from Python's os.path.expanduser, except it only handles the current user. The attempt at being platform agnostic could be improved by checking the target platform rather than blindly trying different environment variables, even though USERPROFILE, HOMEDRIVE, and HOMEPATH are unlikely to be set on Linux.

share improve this answer

这篇关于c++ 获取当前用户的根目录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1003195

相关文章

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat