0

0

C++怎么判断文件是否存在 C++文件系统库用法【方案】

穿越時空

穿越時空

发布时间:2026-03-04 13:02:02

|

766人浏览过

|

来源于php中文网

原创

std::filesystem::exists() 是 c++17 起标准库提供的正统解法,返回 bool 判断路径是否存在,自动处理符号链接,但需 try/catch 捕获 filesystem_error 异常,并确保编译器支持 c++17。

c++怎么判断文件是否存在 c++文件系统库用法【方案】

std::filesystem::exists() 最直接

这是 C++17 起标准库提供的正统解法,不用自己拼路径、调系统 API 或依赖 Boost。它返回 bool,语义清晰,且自动处理符号链接(默认跟随链接判断目标是否存在)。

常见错误是传入空字符串或非法路径导致抛出 std::filesystem::filesystem_error 异常 —— 它不返回 false,而是直接崩溃(如果没捕获)。所以实际使用必须包在 try/catch 里,或者先用 std::filesystem::path 构造并检查是否为空/非法。

  • 确保编译器支持 C++17(如 GCC 8+、Clang 7+、MSVC 2017 15.7+),并启用 -std=c++17
  • 链接时可能需要加 -lstdc++fs(GCC 早期版本),Clang 和新版 GCC 通常自动处理
  • Windows 下路径分隔符用 /\ 都行,std::filesystem::path 会自动标准化

示例:

try {
    if (std::filesystem::exists("config.json")) {
        // 文件存在
    }
} catch (const std::filesystem::filesystem_error& e) {
    // 路径不可访问、权限不足、或根本不是有效路径
}

为什么不用 fopen()access()

老式做法如 fopen("file.txt", "r") 后立即 fclose(),或 POSIX 的 access("file.txt", F_OK),看似简单,但有明显缺陷:

  • fopen() 会触发打开操作,可能被文件锁阻塞;若文件存在但无读权限,它失败,但你其实只想知道“是否存在”,而非“能否读”
  • access() 在 Windows 上不可用(MSVC 不提供),跨平台性差;且它不区分“文件不存在”和“权限被拒”,都返回 -1
  • 两者都无法可靠区分文件、目录、符号链接 —— 而 exists() 只管“路径指向的东西存不存在”,语义更准确

性能上,exists() 底层通常只做一次 stat() 系统调用,和 access() 接近,但比反复 fopen/fclose 更轻量。

Lexica
Lexica

一个搜索 AI 生成图片的网站,可以上传图片或prompts搜索图片。

下载

立即学习C++免费学习笔记(深入)”;

exists() 返回 true 却读不了?注意这几点

返回 true 只说明路径当前可解析、目标存在,不代表你有权限读取、或文件没被其他进程独占锁定。

  • 权限问题:Linux/macOS 下文件可能仅对 owner 可读,而当前进程无权访问;Windows 下 ACL 或只读属性也可能导致后续 std::ifstream 失败
  • 竞态条件:两次调用之间文件可能被删掉或改名 —— 所以不要写“先 exists()open()”,应直接尝试打开并处理失败
  • 符号链接:默认 exists() 跟随链接,若链接目标不存在,它返回 false;如需判断链接本身是否存在,用 std::filesystem::is_symlink(p) && std::filesystem::exists(p, std::filesystem::symlink_option::no_follow)

Windows 下路径含中文或长路径要小心

Windows 默认对路径长度限制为 260 字符(MAX_PATH),且传统 ANSI API 对 UTF-8 路径支持差。而 std::filesystem 在 MSVC 中底层调用的是宽字符 Win32 API(CreateFileW 等),只要传入的 std::string 是 UTF-8 编码(GCC/Clang 默认),或 std::wstring(MSVC 常见),就能正确处理中文路径。

  • 确保源文件保存为 UTF-8(无 BOM 更稳妥),避免编译器把字符串字面量误判为本地编码
  • 长路径需开启系统级支持(Windows 10 1607+),并在程序 manifest 中声明 longPathAware=true,否则超过 260 字符仍会失败
  • 避免手动拼接路径用 "C:\foo\bar",改用 std::filesystem::path("C:/foo") / "bar.txt",自动处理分隔符和编码适配

路径存在性判断本身不触发长路径截断,但后续打开操作会 —— 所以这个坑其实在后续步骤里,不是 exists() 的锅,但容易一起被误诊。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

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

930

2023.08.02

fclose函数的用法
fclose函数的用法

fclose是一个C语言和C++中的标准库函数,用于关闭一个已经打开的文件,是文件操作中非常重要的一个函数,用于将文件流与底层文件系统分离,释放相关的资源。更多关于fclose函数的相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

344

2023.11.30

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

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

698

2023.08.03

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

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

219

2023.09.04

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

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

1561

2023.10.24

字符串介绍
字符串介绍

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

645

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1128

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1102

2024.04.29

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

0

2026.03.04

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.6万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

C++教程
C++教程

共115课时 | 20.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号