当前位置: 首页 > news >正文

C++文件路径处理2 - 路径拼接路径解析

  • 1. 关键词
  • 2. filesystem.h
  • 3. filepath.cpp
  • 6. 测试代码
  • 7. 运行结果
  • 8. 源码地址

1. 关键词

关键词:

C++ 文件路径处理 路径拼接 获取父目录的路径 获取文件名 获取拓展名 跨平台

应用场景:

  • 路径的拼接
  • 路径的解析

2. filesystem.h


#pragma once#include <string>
#include <iostream>
#include <cstdio>
#include "filetype.h"namespace cutl
{/*** @brief The class for file path operations.**/class filepath{public:/*** @brief Construct a new filepath object** @param path file path string*/filepath(const std::string &path);/*** @brief Construct a new filepath object by copy** @param other other filepath object*/filepath(const filepath &other);/*** @brief Assign operator, assign a new filepath object by copy** @param other other filepath object* @return filepath& the reference of the current filepath object*/filepath &operator=(const filepath &other);/*** @brief Destroy the filepath object**/~filepath() = default;public:/*** @brief Get the path separator of the current os platform.** @return the path separator*/static char separator();/*** @brief Get the string of the filepath.** @return the filepath*/std::string str() const;/*** @brief Join the current filepath with a new filename.** @param filename the filename to be joined* @return the new filepath object*/filepath join(const std::string &filename) const;/*** @brief Get the parent directory of the filepath.** @return parent directory path*/std::string dirname() const;/*** @brief Get the filename or directory name of the filepath.** @return filename or directory name*/std::string basename() const;/*** @brief Get the extension of the filepath.** @return extension with dot*/std::string extension() const;private:std::string filepath_;};/*** @brief Define the output stream operator for filepath object.** @param os the std::ostream object* @param fp the filepath object to be output* @return std::ostream& the reference of the std::ostream object after outputing the filepath object.*/std::ostream &operator<<(std::ostream &os, const filepath &fp);/*** @brief Create a filepath object from a string.** @param path file path string* @return filepath object*/filepath path(const std::string &path);} // namespace cutl

3. filepath.cpp


#include "filepath.h"
#include "inner/logger.h"
#include "inner/filesystem.h"
#include "strutil.h"
#include "sysutil.h"namespace cutl
{static constexpr char win_separator = '\\';static constexpr char unix_separator = '/';void fixpath(std::string &path){if (win_separator == filepath::separator()){for (size_t i = 0; i < path.size(); i++){if (path[i] == unix_separator){path[i] = win_separator;}}}else if (unix_separator == filepath::separator()){for (size_t i = 0; i < path.size(); i++){if (path[i] == win_separator){path[i] = unix_separator;}}}else{// do nothing}while (path.empty() || path.back() == filepath::separator()){path.pop_back();}}filepath::filepath(const std::string &path){filepath_ = path;fixpath(filepath_);}filepath::filepath(const filepath &other){filepath_ = other.filepath_;}filepath &filepath::operator=(const filepath &other){this->filepath_ = other.filepath_;return *this;}char filepath::separator(){
#if defined(_WIN32) || defined(__WIN32__)return win_separator;
#elsereturn unix_separator;
#endif}std::string filepath::str() const{return filepath_;}filepath filepath::join(const std::string &filename) const{std::string path = filepath_ + separator() + filename;return filepath(path);}std::string filepath::dirname() const{auto index = filepath_.find_last_of(separator());if (index == std::string::npos){return "";}return filepath_.substr(0, index);}std::string filepath::basename() const{auto index = filepath_.find_last_of(separator());// auto len = filepath_.length() - index - 1;if (index == std::string::npos){return filepath_;}return filepath_.substr(index + 1);}std::string filepath::extension() const{auto pos = filepath_.find_last_of('.');if (pos == std::string::npos){return "";}return filepath_.substr(pos);}std::ostream &operator<<(std::ostream &os, const filepath &fp){os << fp.str();return os;}filepath path(const std::string &path){return filepath(path);}
} // namespace cutl

6. 测试代码

#include "common.hpp"
#include "fileutil.h"void TestJoin()
{PrintSubTitle("TestJoin");auto path1 = cutl::path("/Users/spencer/workspace/common_util/src/usage_demo");auto path2 = path1.join("filepath.hpp");std::cout << "path1: " << path1 << std::endl;std::cout << "path2: " << path2 << std::endl;
}void TestDirnameBasename()
{PrintSubTitle("TestDirnameBasename");auto path1 = cutl::path("/Users/spencer/workspace/common_util/src/usage_demo/filepath.hpp");std::cout << "path1: " << path1 << std::endl;std::cout << "dirname: " << path1.dirname() << std::endl;std::cout << "basename: " << path1.basename() << std::endl;auto path2 = cutl::path("/Users/spencer/workspace/common_util/src/usage_demo");std::cout << "path2: " << path2 << std::endl;std::cout << "dirname: " << path2.dirname() << std::endl;std::cout << "basename: " << path2.basename() << std::endl;auto path3 = cutl::path("filepath.hpp");std::cout << "path3: " << path3 << std::endl;std::cout << "dirname: " << path3.dirname() << std::endl;std::cout << "basename: " << path3.basename() << std::endl;
}void TestExtenstion()
{PrintSubTitle("TestExtenstion");auto path1 = cutl::path("/Users/spencer/workspace/common_util/src/usage_demo/filepath.hpp");std::cout << "path1: " << path1 << ", extension: " << path1.extension() << std::endl;auto path2 = cutl::path("/Users/spencer/workspace/common_util/src/usage_demo/filepath");std::cout << "path2: " << path2 << ", extension: " << path2.extension() << std::endl;
}

7. 运行结果

----------------------------------------------TestJoin----------------------------------------------
path1: /Users/spencer/workspace/common_util/src/usage_demo
path2: /Users/spencer/workspace/common_util/src/usage_demo/filepath.hpp
----------------------------------------TestDirnameBasename-----------------------------------------
path1: /Users/spencer/workspace/common_util/src/usage_demo/filepath.hpp
dirname: /Users/spencer/workspace/common_util/src/usage_demo
basename: filepath.hpp
path2: /Users/spencer/workspace/common_util/src/usage_demo
dirname: /Users/spencer/workspace/common_util/src
basename: usage_demo
path3: filepath.hpp
dirname: 
basename: filepath.hpp
-------------------------------------------TestExtenstion-------------------------------------------
path1: /Users/spencer/workspace/common_util/src/usage_demo/filepath.hpp, extension: .hpp
path2: /Users/spencer/workspace/common_util/src/usage_demo/filepath, extension: 

8. 源码地址

更多详细代码,请查看本人写的C++ 通用工具库: common_util, 本项目已开源,代码简洁,且有详细的文档和Demo。

本文由博客一文多发平台 OpenWrite 发布!

相关文章:

C++文件路径处理2 - 路径拼接路径解析

1. 关键词2. filesystem.h3. filepath.cpp6. 测试代码7. 运行结果8. 源码地址 1. 关键词 关键词&#xff1a; C 文件路径处理 路径拼接 获取父目录的路径 获取文件名 获取拓展名 跨平台 应用场景&#xff1a; 路径的拼接路径的解析 2. filesystem.h #pragma once#include…...

数据结构5---矩阵和广义表

一、矩阵的压缩存储 特殊矩阵:矩阵中很多值相同的元素并且它们的分布有一定的规律。 稀疏矩阵:矩阵中有很多零元素。压缩存储的基本思想是: (1)为多个值相同的元素只分配一个存储空间; (2)对零元素不分配存储空间。 1、特殊矩阵的压缩存储 &#xff08;1&#xff09;对称矩…...

jquery使用infinitescroll无线滚动+自定义翻页

jquery版本 jquery-1.8.3.js infinitescroll版本 2.0.0 如果infinitescroll版本最新的jquery版本也要用新的 接口用nodejs jquery.infinitescroll.js官网地址 前端代码《接口返回JSON数据》 <!DOCTYPE html> <html lang"en"> <head><meta cha…...

【漏洞复现】锐捷统一上网行为管理与审计系统——远程命令执行漏洞

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 锐捷统一上网行为管理与审计系统naborTable/static_convert.php…...

通义灵码上线 Visual Studio 插件市场啦!

通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力&#xff0c;提供代码智能生成、研发智能问答能力。 通义灵…...

GESP 四级急救包(2):客观题真题集

客观题真题集 一、选择题1. 真题梳理2. 真题答案3. 重难点点播(1) 指针和地址(2) 时间复杂度 二、判断题1. 真题梳理2. 真题答案 一、选择题 1. 真题梳理 若函数声明为 void f(int &a, int b, const int &c)&#xff0c;且在主函数内已经声明了 x , y , z x,y,z x,y,…...

VERYCLOUD睿鸿股份确认参展2024年ChinaJoy BTOB商务洽谈馆,期待与你相聚

作为在全球数字娱乐领域兼具知名度与影响力的年度盛会&#xff0c;2024年第二十一届ChinaJoy将于7月26日至7月29日在上海新国际博览中心盛大召开&#xff0c;本届展会主题为&#xff1a;初心“游”在&#xff0c;精彩无限&#xff01;&#xff08;Stay True, Game On.&#xff…...

Java面试题:讨论Spring框架的核心组件,如IoC容器、AOP、事务管理等

Spring框架是一个功能强大且灵活的Java企业级应用开发框架&#xff0c;其核心组件包括以下几个主要部分&#xff1a; 1. IoC容器&#xff08;Inversion of Control Container&#xff09; IoC容器是Spring框架的核心部分&#xff0c;用于管理应用程序的依赖注入&#xff08;D…...

【方案】基于5G智慧工业园区解决方案(PPT原件)

5G智慧工业园区整体解决方案旨在通过集成5G通信技术、物联网、大数据和云计算等先进技术&#xff0c;实现园区的智能化、高效化和绿色化。 该方案首先构建高速、稳定的5G网络&#xff0c;确保园区内设备、人员与物流的实时连接和高效沟通。其次&#xff0c;通过工业物联网技术&…...

使用System.currentTimeMillis获取当前时间

使用System.currentTimeMillis获取当前时间 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨Java中如何使用System.currentTimeMillis()方法来获取…...

手机远程控制另一台手机的全新使用教程(安卓版)

看完这篇文章&#xff0c;你可以了解到安卓手机如何远程控制安卓手机&#xff0c;以及苹果手机如何远程控制安卓手机。 如果想要用安卓手机远程管控苹果手机&#xff0c;或者苹果手机远程管控另一台苹果手机&#xff0c;请点击查看视频《手机远程管控另一台手机的全新使用教程…...

商城积分系统的代码实现(上)-- 积分账户及收支记录

一、背景 上一系列文章&#xff0c;我们说了积分的数模设计及接口设计&#xff0c;接下里&#xff0c;我们将梳理一下具体的代码实现。 使用的语言的java&#xff0c;基本框架是spring-boot&#xff0c;持久化框架则是Jpa。 使用到的技术点有&#xff1a; 分布式锁&#xf…...

【C++进阶9】异常

一、C语言传统的处理错误的方式 终止程序&#xff0c;如assert 如发生内存错误&#xff0c;除0错误时就会终止程序返回错误码 需要程序员自己去查找对应的错误 z如系统的很多库的接口函数都是通 过把错误码放到errno中&#xff0c;表示错误 二、C异常概念 异常&#xff1a;函…...

RecyclerVIew->加速再减速的RecyclerVIew平滑对齐工具类SnapHelper

XML文件 ItemView的XML文件R.layout.shape_item_view <?xml version"1.0" encoding"utf-8"?> <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"100dp"android:layout_heig…...

突破SaaS产品运营困境:多渠道运营如何集中管理?

随着数字化时代的到来&#xff0c;SaaS&#xff08;软件即服务&#xff09;产品已成为企业日常运营不可或缺的工具。然而&#xff0c;在竞争激烈的市场环境下&#xff0c;SaaS产品运营越来越重视多渠道、多平台布局&#xff0c;以更广泛地触及潜在用户&#xff0c;然而&#xf…...

智能语音热水器:置入NRK3301离线语音识别ic 迈向智能家居新时代

一、热水器语音识别芯片开发背景 在科技的今天&#xff0c;人们对于生活品质的追求已不仅仅满足于基本的物质需求&#xff0c;更渴望通过智能技术让生活变得更加便捷、舒适。热水器作为家庭生活中不可或缺的一部分&#xff0c;其智能化转型势在必行。 在传统热水器使用中&#…...

Redis集群部署合集

目录 一. 原理简述 二. 集群配置​​​​​​​ 2.1 环境准备 2.2 编译安装一个redis 2.3 创建集群 2.4 写入数据测试 实验一&#xff1a; 实验二&#xff1a; 实验三&#xff1a; 实验四&#xff1a; 添加节点 自动分配槽位 提升节点为master&#xff1a; 实验…...

【HDFS】关于Hadoop的IPC.Client类的一些整理

org.apache.hadoop.ipc.Client 类是IPC服务的一个客户端。 IPC请求把一个Writable对象当做参数,返回一个Writable对象当做结果value。 一个IPC服务运行在某个端口上,并且由参数class和value class定义。 Router里的IPC.Client对象就两个 有这样一个类:ClientCache 看名字就…...

Swoole v6 能否让 PHP 再次伟大?

现状 传统的 PHP-FPM 也是多进程模型的的运行方式&#xff0c;但每个进程只能处理完当前请求&#xff0c;才能接收下一个请求。而且对于 PHP 脚本来说&#xff0c;只是接收请求和响应请求&#xff0c;并不参与网络通信。对数据库资源的操作&#xff0c;也是一次请求一次有效&am…...

C++ STL Iterator Adapter

1. std::back_insert_iterator 使用 // back_insert_iterator example #include <iostream> // std::cout #include <iterator> // std::back_insert_iterator #include <vector> // std::vector #include <algorithm> // std::copy…...

android-aidl5

aidl类是实现Manager和Service通信的桥梁。 例如在修改Android Wifi功能的时候看到WifiManager管理WifiService&#xff1b; AIDL是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。 比如onclick&#xff08;&#xff09;&#xff0c;用oneway修…...

day01-项目介绍及初始化-登录页

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 day01-项目介绍及初始化-登录页一、人力资源项目介绍1.1项目架构和解决方案主要模块解决的问题 二、拉取项目基础代码1.引入库2.升级core-js版本到3.25.5按照完整依…...

华为开发者大会:全场景智能操作系统HarmonyOS NEXT

文章目录 一、全场景智能操作系统 - HarmonyOS NEXT1.1 系统特性1.2 关于架构、体验和生态 二、应用案例2.1 蚂蚁mpaas平台的性能表现 三、新版本应用框架发布3.1 新语言发布3.2 新数据库发布3.3 新版本编译器的发布 四、CodeArts和DataArts4.1 CodeArts4.2 DataArts 五、总结 …...

深度学习二分类评估详细解析与代码实战

深度学习二分类的实战代码&#xff1a;使用 Trainer API 微调模型. https://huggingface.co/learn/nlp-course/zh-CN/chapter3/3 如果你刚接触 自然语言处理&#xff0c;huggingface 是你绕不过去的坎。但是目前它已经被墙了&#xff0c;相信读者的实力&#xff0c;自行解决吧。…...

c++笔记容器详细介绍

C标准库提供了多种容器来存储和管理数据。这些容器属于<vector>, <list>, <deque>, <map>, <set>, <unordered_map>, <unordered_set>等头文件中。这些容器各有优缺点&#xff0c;适用于不同的场景。下面详细介绍几种主要的容器及其…...

CS144 Lab3 TCPSender复盘

一.基础概念 1.TCPSender在TCPSocket中的地位与作用 Lab0中实现了基于内存模拟的流控制-字节流&#xff08;ByteStream&#xff09;&#xff0c;底层使用std::deque实现&#xff0c;根据最大容量Capacity进行容量控制。个人理解它相当于应用层的输入输出缓存区&#xff0c;用户…...

建筑可视化中使用云渲染的几大理由

在建筑行业中&#xff0c;可视化技术已成为不可或缺的一部分。无论是设计方案的展示、施工进度的模拟&#xff0c;还是最终效果的呈现&#xff0c;建筑可视化都发挥着至关重要的作用。 建筑可视化是指通过计算机技术和图形学算法&#xff0c;将建筑设计、规划和施工过程中的数据…...

Python数据可视化-地图可视化

1.首先绘制实现数据可视化的思维导图 具体要实现什么功能-怎么处理&#xff0c;先把思路写好 数据来源&#xff1a; 爬取的数据 运行结果&#xff1a; 部分代码&#xff1a; 完整代码请在下方↓↓↓&#x1f447;获取 转载请注明出处&#xff01;...

leetcode 动态规划(基础版)单词拆分

题目&#xff1a; 题解&#xff1a; 一种可行的dp做法是基于完全背包问题&#xff0c;将s看成是一个背包&#xff0c;wordDict看作是物品&#xff0c;然后往s中放入物品判断最终是否可以变为给定的s即可。这道题和上一题都用到了在dp如何枚举连续子串和状态表示&#xff1a;枚…...

Ubuntu/Linux调试安装南京来可CAN卡

准备好USB rules文件和can driver文件备用! 必做&#xff1a;放置USB rules文件到对应位置处理权限问题 而后&#xff1a;安装内核driver并编译。需求众多依赖编译环境&#xff0c;视情况安装填补。如GCC,G,make等等 进入对应64bit文件夹中&#xff0c;添加权限&#xff0c;执…...

公司需要一个简单的网站/下载百度地图2022最新版官方

Tools 工具 性能分析– 在脚本运行期定时执行不同函数和操作&#xff0c;找出需要优化的部分 网络分析– 检查图片&#xff0c;样式表&#xff0c;和脚本的加载过程&#xff0c;汇报它们对整个页面加载和渲染的影响 网络面板 每个资源后面的彩条将加载过程分解为组件阶段&am…...

做视频类型的网站/广州:推动优化防控措施落地

由于公司要做整套电子商务解决方案&#xff0c;考虑到平台的通用性&#xff08;其中b2b、b2c、o2o、小程序&#xff0c;都离不开基础平台&#xff09;&#xff0c;优先给公司规划&#xff1a; 平台管理端&#xff08;统一管理&#xff0c;包含自营店铺&#xff09;、商家管理端…...

广告投放平台代理/海洋seo

计算机应用基础教程(2015年中国科学技术大学出版社出版的图书)语音编辑锁定讨论上传视频《计算机应用基础教程》是2015年中国科学技术大学出版社出版的图书&#xff0c;作者是琚松苗。书 名计算机应用基础教程作 者琚松苗出版社出版时间2015年8月1日定 价40 元装 帧…...

如何做网站的订阅/发外链比较好的平台

&#xff5b;一、编写服务端程序&#xff5d; 第一步&#xff1a;创建项目。1&#xff0c;File –> New –> Other –> WebServices –> Soap Server Application。2&#xff0c;默认选择“ ISAPI/NSAPI Dynamic Link Library”&#xff0c;然后点“OK”。3&#x…...

如何做招聘网站统计表/百度搜索指数和资讯指数

查看Linux ARP缓存老化时间cat /proc/sys/net/ipv4/neigh/eth0/base_reachable_time同目录下还有一个文件gc_stale_time&#xff0c;官方解释如下&#xff1a;Determines how often to check for stale neighbour entries.When a neighbour entry is considered stale it is re…...

牛商网做网站/搜外seo

题目来源大部分是天津大学周伟的那篇论文《状态压缩》 论文中主要介绍了几种模型&#xff0c;1.棋盘模型&#xff0c;2.覆盖模型&#xff0c;3.状态压缩在图论中的应用 在看完论文后再做题更有好处 这里给出的代码并不是最优的&#xff0c;事实上有些题目用状态压缩来做&#x…...