c++如何获取文件的扩展名_path::extension与stem用法【实战】

轻明小哥_3350

轻明小哥_3350

2026-03-30

450人浏览

原创

std::filesystem::path::extension() 返回带点号的扩展名(如".txt"),需注意空扩展、尾部空格、大小写敏感及非法路径等问题,正确用法应先校验再截取。

c++如何获取文件的扩展名_path::extension与stem用法【实战】

用 std::filesystem::path::extension() 获取扩展名,但要注意点号是否包含

它返回的是带点号的字符串,比如 "file.txt" 的 extension() 是 ".txt",不是 "txt"。这点容易在字符串比较或拼接时出错。

常见错误现象:用 if (p.extension() == "txt") 判断失败——因为实际是 ".txt"。

  • 如果需要纯后缀名(不含点),用 p.extension().string().substr(1),但得先检查是否非空且以点开头
  • 更稳妥的做法是:auto ext = p.extension(); if (!ext.empty() && ext.string()[0] == '.') { /* 取 substr(1) */ }
  • 空扩展名(如 "Makefile")会返回空 path,.string() 是空串,别直接 substr(1)

stem() 不是“文件名”,而是“去掉扩展名后的主干”

stem() 返回的是 filename() 去掉 extension() 的部分,不是路径中最后一级的完整名字。例如 "/a/b/file.tar.gz" 的 stem() 是 "file.tar",不是 "file"。

使用场景:批量处理压缩包时想保留原始名,又不想带 .tar.gz;或者做文件重命名时需隔离主干与后缀。

  • stem() 对 "readme"(无扩展名)返回 "readme";对 "readme."(结尾有点)返回 "readme";对 "readme.." 返回 "readme."
  • 它不处理多级扩展名逻辑,只按最后一个点切分 —— 这是标准行为,不是 bug
  • 若需“去掉所有已知后缀”,得自己维护后缀列表并循环调用 replace_extension("")

Windows 路径下 extension() 可能返回 ". "(点+空格)

某些旧工具生成的文件名末尾带空格(如 "report.txt "),Windows 文件系统允许,std::filesystem 会把末尾空格视作文件名一部分,导致 extension() 返回奇怪结果,比如 ". " 或空。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

这不是库的问题,而是路径本身不规范。真实项目中遇到过因资源管理器重命名残留空格引发的解析失败。

  • 读取文件名后建议先用 std::string::find_last_not_of(" \t\r\n") 截断尾部空白
  • 不要依赖 extension() 做安全校验(如判断是否为图片),应结合 MIME 类型或 magic bytes
  • C++20 中 std::filesystem 对非法路径容忍度低,遇到含控制字符或 Unicode 归一化异常的路径可能抛 std::filesystem::filesystem_error

跨平台时注意 operator/ 和大小写敏感性对 extension() 的间接影响

extension() 本身不涉及路径拼接或大小写,但你传给它的 path 对象常来自拼接或遍历。Linux 下 "FILE.TXT" 和 "file.txt" 是不同文件,而 Windows 不区分——这会导致同一段代码在不同系统上拿到的 extension() 值虽然正确,但后续逻辑(如查找配置表)可能因大小写不一致失效。

  • 避免直接用 p.extension() == ".json" 做判断;改用 p.extension().string().compare(".json") == 0 或转小写后再比
  • 用 std::filesystem::canonical() 前先确认目标存在,否则可能抛异常,导致 extension() 根本没机会调用
  • 构建 path 时优先用 u8string 或 UTF-8 字符串字面量,避免 Windows 下 string 含 GBK 编码导致 extension() 解析错位

事情说清了就结束。最麻烦的从来不是怎么调函数,而是你传进去的那个 path 对象,到底是不是你以为的样子。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2255

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3602

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1196

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4159

7

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7059

3

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1858

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2984

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6264

49

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

2023.11.24

6209

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习