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. 关键词 关键词: C 文件路径处理 路径拼接 获取父目录的路径 获取文件名 获取拓展名 跨平台 应用场景: 路径的拼接路径的解析 2. filesystem.h #pragma once#include…...
数据结构5---矩阵和广义表
一、矩阵的压缩存储 特殊矩阵:矩阵中很多值相同的元素并且它们的分布有一定的规律。 稀疏矩阵:矩阵中有很多零元素。压缩存储的基本思想是: (1)为多个值相同的元素只分配一个存储空间; (2)对零元素不分配存储空间。 1、特殊矩阵的压缩存储 (1)对称矩…...
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…...
【漏洞复现】锐捷统一上网行为管理与审计系统——远程命令执行漏洞
声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 锐捷统一上网行为管理与审计系统naborTable/static_convert.php…...
通义灵码上线 Visual Studio 插件市场啦!
通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,提供代码智能生成、研发智能问答能力。 通义灵…...
GESP 四级急救包(2):客观题真题集
客观题真题集 一、选择题1. 真题梳理2. 真题答案3. 重难点点播(1) 指针和地址(2) 时间复杂度 二、判断题1. 真题梳理2. 真题答案 一、选择题 1. 真题梳理 若函数声明为 void f(int &a, int b, const int &c),且在主函数内已经声明了 x , y , z x,y,z x,y,…...
VERYCLOUD睿鸿股份确认参展2024年ChinaJoy BTOB商务洽谈馆,期待与你相聚
作为在全球数字娱乐领域兼具知名度与影响力的年度盛会,2024年第二十一届ChinaJoy将于7月26日至7月29日在上海新国际博览中心盛大召开,本届展会主题为:初心“游”在,精彩无限!(Stay True, Game On.ÿ…...
Java面试题:讨论Spring框架的核心组件,如IoC容器、AOP、事务管理等
Spring框架是一个功能强大且灵活的Java企业级应用开发框架,其核心组件包括以下几个主要部分: 1. IoC容器(Inversion of Control Container) IoC容器是Spring框架的核心部分,用于管理应用程序的依赖注入(D…...
【方案】基于5G智慧工业园区解决方案(PPT原件)
5G智慧工业园区整体解决方案旨在通过集成5G通信技术、物联网、大数据和云计算等先进技术,实现园区的智能化、高效化和绿色化。 该方案首先构建高速、稳定的5G网络,确保园区内设备、人员与物流的实时连接和高效沟通。其次,通过工业物联网技术&…...
使用System.currentTimeMillis获取当前时间
使用System.currentTimeMillis获取当前时间 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨Java中如何使用System.currentTimeMillis()方法来获取…...
手机远程控制另一台手机的全新使用教程(安卓版)
看完这篇文章,你可以了解到安卓手机如何远程控制安卓手机,以及苹果手机如何远程控制安卓手机。 如果想要用安卓手机远程管控苹果手机,或者苹果手机远程管控另一台苹果手机,请点击查看视频《手机远程管控另一台手机的全新使用教程…...
商城积分系统的代码实现(上)-- 积分账户及收支记录
一、背景 上一系列文章,我们说了积分的数模设计及接口设计,接下里,我们将梳理一下具体的代码实现。 使用的语言的java,基本框架是spring-boot,持久化框架则是Jpa。 使用到的技术点有: 分布式锁…...
【C++进阶9】异常
一、C语言传统的处理错误的方式 终止程序,如assert 如发生内存错误,除0错误时就会终止程序返回错误码 需要程序员自己去查找对应的错误 z如系统的很多库的接口函数都是通 过把错误码放到errno中,表示错误 二、C异常概念 异常:函…...
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产品运营困境:多渠道运营如何集中管理?
随着数字化时代的到来,SaaS(软件即服务)产品已成为企业日常运营不可或缺的工具。然而,在竞争激烈的市场环境下,SaaS产品运营越来越重视多渠道、多平台布局,以更广泛地触及潜在用户,然而…...
智能语音热水器:置入NRK3301离线语音识别ic 迈向智能家居新时代
一、热水器语音识别芯片开发背景 在科技的今天,人们对于生活品质的追求已不仅仅满足于基本的物质需求,更渴望通过智能技术让生活变得更加便捷、舒适。热水器作为家庭生活中不可或缺的一部分,其智能化转型势在必行。 在传统热水器使用中&#…...
Redis集群部署合集
目录 一. 原理简述 二. 集群配置 2.1 环境准备 2.2 编译安装一个redis 2.3 创建集群 2.4 写入数据测试 实验一: 实验二: 实验三: 实验四: 添加节点 自动分配槽位 提升节点为master: 实验…...
【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 也是多进程模型的的运行方式,但每个进程只能处理完当前请求,才能接收下一个请求。而且对于 PHP 脚本来说,只是接收请求和响应请求,并不参与网络通信。对数据库资源的操作,也是一次请求一次有效&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…...
从Imagination董事会风波看半导体IP行业的地缘政治与商业模式挑战
1. 从一场董事会风波看全球半导体IP格局的变迁最近几年,半导体行业的朋友们茶余饭后除了聊制程、聊架构,也少不了聊各种资本并购的“大戏”。其中,英国GPU IP巨头Imagination Technologies的董事会风波,堪称一部集商业、资本与地缘…...
国标通气帽、DN200通气帽与市政管道通气帽怎么选?
我第一次接触通气帽这玩意儿,是在一个闷热的下午。工地上尘土飞扬,师傅递给我一个金属罩子,说:“这是通气用的,别小看它。”我当时还纳闷:不就是个帽子嘛,能有多大讲究?后来才明白&a…...
告别手动重命名!Win10下用记事本写个.bat脚本,5分钟搞定图片批量编号(001.jpg到999.jpg)
零基础玩转Windows批量重命名:用记事本5分钟打造专属文件编号神器 每次旅行归来或项目结束,手机相册里堆积如山的照片总让人头疼——"IMG_20230401_123456.jpg"这类毫无规律的命名,既难查找又难管理。专业摄影师和自媒体博主们早就…...
如何用Figma-to-JSON解决设计开发协作难题:4个实用场景详解
如何用Figma-to-JSON解决设计开发协作难题:4个实用场景详解 【免费下载链接】figma-to-json 💾 Read/Write Figma Files as JSON 项目地址: https://gitcode.com/gh_mirrors/fi/figma-to-json 在当今快速迭代的产品开发环境中,设计师与…...
别再只跟 AI 聊天了,教它干活才是正经事
摘要大模型只会聊天?那你可能用错了方式。函数调用让 AI 从"说"变成"做",能真正执行任务。本文分享我搭建 AI Agent 的实战经验,包括工具设计、参数校验、错误处理等核心环节,帮你避开那些我踩过的坑。开篇引…...
MATLAB roots函数实战:5分钟搞定高阶系统稳定性判断(附完整代码)
MATLAB roots函数实战:高阶系统稳定性分析的黄金法则 在控制工程和自动化领域,系统稳定性分析是每个工程师的必修课。面对复杂的高阶系统特征方程,传统的手工计算方法不仅耗时耗力,还容易出错。而MATLAB的roots函数配合简单的可视…...
Ask your GIT:AI驱动的代码仓库智能助手,一键解析与安装
1. 项目概述:一个为开发者“减负”的智能代码助手在GitHub、GitLab或者Bitbucket上发现一个看起来很有潜力的开源项目,是每个开发者的日常。但随之而来的,往往是长达十几甚至几十分钟的“阅读理解”时间:你得先通读冗长的README&a…...
如何快速掌握ComfyUI-WanVideoWrapper:AI视频生成从入门到精通
如何快速掌握ComfyUI-WanVideoWrapper:AI视频生成从入门到精通 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper ComfyUI-WanVideoWrapper 是一款专为ComfyUI设计的强大AI视频生成插件…...
不止于下载:用Active-HDL给你的Lattice FPGA设计做个“体检”(功能仿真实战)
从功能仿真到可靠设计:Active-HDL在Lattice FPGA开发中的深度实践 当LED灯在你的FPGA开发板上如期闪烁时,那种成就感确实令人振奋。但作为经历过多次调试煎熬的工程师,我必须告诉你:能下载运行只是FPGA开发的起点,而非…...
别再只写客户端了!用C语言搞定聊天室全栈开发:客户端+服务端联调避坑指南
别再只写客户端了!用C语言搞定聊天室全栈开发:客户端服务端联调避坑指南 在C语言全栈开发中,客户端和服务端的联调往往是开发者最容易踩坑的环节。很多初学者能够独立完成客户端或服务端的代码编写,但当两者需要协同工作时&#x…...
