0

0

C++怎么判断文件是否存在_C++检查文件路径方法【技巧】

尼克

尼克

发布时间:2026-03-17 21:03:12

|

638人浏览过

|

来源于php中文网

原创

最直接的方式是使用C++17标准库的std::filesystem::exists(),需传入std::filesystem::path类型路径,注意包含头文件并链接-lstdc++fs(GCC早期版本),Windows下支持/或分隔符,相对路径基于当前工作目录,符号链接默认不追踪目标。

c++怎么判断文件是否存在_c++检查文件路径方法【技巧】

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

这是 C++17 起标准库提供的正统方式,不依赖系统 API,跨平台、语义清晰。它返回 bool,传入路径即可判断——但注意:路径必须是 std::filesystem::path 类型,不能直接传 const char*std::string(否则编译失败)。

常见错误现象:error: no matching function for call to 'exists',多半是因为没加 #include <filesystem></filesystem>,或忘了链接 -lstdc++fs(GCC 早期版本需显式链接)。

  • Windows 下路径分隔符用 /\ 都行,std::filesystem::path 会自动归一化
  • 如果路径是相对路径,判断基于当前工作目录(不是可执行文件所在目录),这点容易误判
  • 对符号链接,默认只检查链接本身是否存在,不追踪目标;如需检查目标存在,用 std::filesystem::is_regular_file(p) && std::filesystem::exists(p) 组合
#include <filesystem>
namespace fs = std::filesystem;
if (fs::exists("config.json")) {
    // 文件存在
}

Windows 下用 GetFileAttributesW() 更轻量

不引入 std::filesystem 依赖时,Windows 原生 API 是可靠选择。它速度快、无额外开销,但仅限 Windows,且需处理宽字符路径(推荐用 std::wstringL"..." 字面量)。

使用场景:嵌入式 Windows 工具、对启动时间敏感的命令行程序、或项目尚未升级到 C++17。

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

  • 返回值为 INVALID_FILE_ATTRIBUTES 表示路径无效或访问被拒(比如权限不足),不能只靠是否为 -1 判断
  • 要区分“不存在”和“无权限”,得再调用 GetLastError() 检查是否等于 ERROR_ACCESS_DENIED
  • 传入 TEXT("C:\temp\data.txt") 时,确保宏定义了 UNICODE,否则 GetFileAttributesA() 可能因编码问题误判中文路径
#include <windows.h>
if (GetFileAttributesW(L"input.txt") != INVALID_FILE_ATTRIBUTES) {
    // 存在(且可访问)
}

Linux/macOS 下用 access() 简单够用

POSIX 标准函数,头文件是 unistd.h,参数是 C 风格字符串,比 stat() 少一次系统调用,适合只关心“是否存在”的场景。

ARTi.PiCS
ARTi.PiCS

ARTi.PiCS是一款由AI驱动的虚拟头像生产器,可以生成200多个不同风格的酷炫虚拟头像

下载

容易踩的坑:默认只检查路径能否被当前进程访问(即是否在 F_OK 权限下可见),但不会告诉你是不是普通文件——比如路径指向一个目录,access(path, F_OK) 也返回 0。

  • 若需确认是文件而非目录,应改用 stat() 并检查 st_mode & S_IFREG
  • 路径含中文时,确保程序 locale 设置正确(如 setlocale(LC_ALL, "")),否则 access() 可能返回 -1
  • 不支持 Windows,混用时需条件编译:#ifdef __linux__ / #ifdef __APPLE__
#include <unistd.h>
if (access("log.txt", F_OK) == 0) {
    // 路径存在且可访问
}

别用 fopen() + fclose() 判断存在性

这是新手高频误操作:打开再立刻关闭来“试探”文件。它看似简单,但实际埋了多个雷。

为什么这样做很危险?因为 fopen() 成功只说明“此刻可读/可写”,不等于“文件存在”——比如路径是管道、设备文件、甚至网络挂载点,fopen() 也可能成功;反过来,文件存在但权限不足时又会失败,混淆判断逻辑。

  • 性能差:涉及完整 I/O 栈初始化,比 exists()access() 慢一个数量级
  • 副作用大:某些文件系统(如 NFS)可能触发真实读取或日志记录
  • 线程不安全:若其他线程正在删除该文件,fopen() 可能成功但后续操作失败,造成竞态

真正需要“存在且可读”时,应该先 exists(),再按需 fopen() ——两步分离,意图清晰,边界明确。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

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

1091

2023.08.02

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

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

345

2023.11.30

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

385

2023.10.25

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

385

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

565

2023.09.20

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

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

761

2023.08.03

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

17

2026.03.17

热门下载

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

精品课程

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

共94课时 | 11.5万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.3万人学习

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

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