当前位置: 首页 > 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…...

WarcraftHelper:魔兽争霸III性能优化终极指南 - 10分钟打造完美游戏体验

WarcraftHelper&#xff1a;魔兽争霸III性能优化终极指南 - 10分钟打造完美游戏体验 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸III作为经…...

Win11更新后Wifi图标消失?别急着重装系统,先试试这个官方驱动修复法

Win11更新后Wifi图标消失&#xff1f;三步精准定位官方驱动修复方案 刚更新完Windows 11系统&#xff0c;正准备继续手头的工作&#xff0c;突然发现任务栏右下角的Wifi图标不翼而飞。尝试重启电脑、重置网络设置&#xff0c;甚至检查了各种服务状态&#xff0c;问题依旧存在。…...

United VARs CoE创享会重回上海,全球伙伴共议AI时代云ERP演进

时隔七年&#xff0c;United VARs Cloud ERP CoE 创享会再次回到中国&#xff01;3月10日至12日&#xff0c;由Acloudear司享承办的United VARs Cloud ERP CoE 创享会在上海举行。来自全球多家United VARs成员机构及SAP的专家与管理者齐聚上海&#xff0c;围绕 Cloud ERP 战略、…...

在ALV当中上传的excel形式的layout,没法删除怎么办?

明明点了上边的删除键&#xff08;-&#xff09;也保存了&#xff0c;下次进入还是存在。OAOR,上传的模板都在里面&#xff0c;点击删除即可...

电子设计竞赛必备:RC、运放、TTL信号处理电路实战指南(附避坑技巧)

电子设计竞赛信号处理电路实战&#xff1a;从RC滤波到TTL脉冲的进阶技巧 第一次参加电子设计竞赛时&#xff0c;我在信号处理环节浪费了整整两天时间——原本清晰的方波经过电路后变得面目全非&#xff0c;放大后的信号带着令人头疼的振荡&#xff0c;而评委要求的脉冲宽度总是…...

智能排障:快马ai助手实时解答openclaw安装难题,告别卡壳

最近在折腾OpenClaw这个工具时&#xff0c;发现它的安装过程真是让人头大——各种依赖报错、环境冲突、权限问题接踵而至。好在发现了InsCode(快马)平台的AI辅助功能&#xff0c;简直像给安装过程装上了智能导航。下面分享我的实战经验&#xff0c;如何用AI快速攻克OpenClaw安装…...

ALM代码编辑器实战教程:从HTML到TSX的转换技巧

ALM代码编辑器实战教程&#xff1a;从HTML到TSX的转换技巧 【免费下载链接】alm :rose: A :cloud: ready IDE just for TypeScript :heart: 项目地址: https://gitcode.com/gh_mirrors/al/alm ALM代码编辑器是一款专为TypeScript开发打造的云端IDE&#xff0c;提供了丰富…...

零基础如何用罗技鼠标宏实现绝地求生自动压枪?高效配置指南

零基础如何用罗技鼠标宏实现绝地求生自动压枪&#xff1f;高效配置指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在《绝地求生》中因…...

【vue】二、vue2仿去哪儿网app——首页开发实战:从零搭建到性能优化

1. 项目初始化与页面结构设计 开始一个Vue2仿去哪儿网App首页项目&#xff0c;首先要搭建基础框架。我习惯用vue-cli脚手架快速初始化项目&#xff0c;这个工具能帮我们处理好webpack配置、基础目录结构等繁琐工作。执行vue init webpack qunar-app命令后&#xff0c;会生成标…...

超高压输电线路空载运行时的电压升高现象解析

1. 为什么空载时线路末端电压会升高&#xff1f; 第一次接触超高压输电线路时&#xff0c;很多工程师都会对这个现象感到困惑&#xff1a;明明没有接任何用电设备&#xff0c;为什么线路末端的电压反而比始端更高&#xff1f;这就像往一根长长的水管里注水&#xff0c;结果发现…...