c++ 判断文件存在方法

C++之判断文件是否存在的几种方法 阅读详情
一般方法

一般而言,下述方法都可以检查文件是否存在:

  • 使用ifstream打开文件流,成功则存在,失败则不存在
  • 以fopen读方式打开文件,成功则存在,否则不存在
  • 使用access函数获取文件状态,成功则存在,否则不存在
  • 使用stat函数获取文件状态,成功则存在,否则不存在

代码如下:

#include <sys/stat.h>
#include <unistd.h>
#include <string>
#include <fstream>

inline bool exists_test0 (const std::string& name) {
    ifstream f(name.c_str());
    return f.good();
}

inline bool exists_test1 (const std::string& name) {
    if (FILE *file = fopen(name.c_str(), "r")) {
        fclose(file);
        return true;
    } else {
        return false;
    }   
}

inline bool exists_test2 (const std::string& name) {
    return ( access( name.c_str(), F_OK ) != -1 );
}

inline bool exists_test3 (const std::string& name) {
  struct stat buffer;   
  return (stat (name.c_str(), &buffer) == 0); 
}
123456789101112131415161718192021222324252627

参考资料中有性能测试对比,结果表明,使用 stat() 函数的方式性能最好。

# Results for total time to run the 100,000 calls averaged over 5 runs,

Method exists_test0 (ifstream): **0.485s**
Method exists_test1 (FILE fopen): **0.302s**
Method exists_test2 (posix access()): **0.202s**
Method exists_test3 (posix stat()): **0.134s**
123456
boost库

boost.filesystem在发生错误的时候会抛出异常,但是在大部分情况下这些异常是可以忽略的,例如,在检查文件是否存在的时候,发生错误可以等同于文件不存在。

虽然boost.filesystem也提供了重载函数,通过输出参数返回错误来代替异常,但是在每个调用点都得定义一个输出参数,稍显麻烦。

所以,为了简化客户代码,我们实现了一些包装函数,如下所示:

bool IsFileExistent(const boost::filesystem::path& path) {
    boost::system:error_code error;
    return boost::filesystem::is_regular_file(path, error);
}
1234

上面的函数用来检查文件是否存在,使用了boost::filesystem::is_regular_file。当path指向一个“常规文件”的时候,认为该文件存在;否则其它任何情况都认为文件不存在。

对于只有常规文件的情况,该函数没有问题。但是,如果还存在其他文件时,如符号链接文件时,则返回文件不存在。

事实上,用boost::filesystem::status获取时,会返回symlink_file,boost.filesystem将它们视为符号链接文件。

不论是常规文件还是符号链接文件,呈现给用户的都是能够正常使用的文件。

所以,不能单纯地用boost::filesystem::is_regular_file来检查文件是否存在了,下面是包装函数的改进版本:

bool IsFileExistent(const boost::filesystem::path& path) {

    boost::system:error_code error;
    auto file_status = boost::filesystem::status(path, error);
    if (error) {
        return false;
    }

    if (! boost::filesystem::exists(file_status)) {
        return false;
    }

    if (boost::filesystem::is_directory(file_status)) {
        return false;
    }

    return true;
}
123456789101112131415161718

首先,通过boost::filesystem::status获取文件的信息,如果发生错误,则认为文件不存在。

然后,使用boost::filesystem::exists判断文件是否存在,该函数不区分文件夹和文件,所以最后还要使用boost::filesystem::is_directory判断一下是否文件夹,只要不是文件夹,都认为文件是存在的。

参考资料:


Fastest way to check if a file exist using standard C++/C++11/C?
使用boost.filesystem检查文件是否存在的正确方式

别再傻傻全盘暴力破解了!Passware Kit Forensic 2019.4.1 已知部分密码的精准爆破实战(附RAR案例) 本文详细介绍了如何利用Passware Kit Forensic的模式匹配功能,实现高效精准的密码破解,避免全盘暴力破解的资源浪费。通过RAR加密破解实战案例,展示了模式匹配技术的核心优势与操作步骤,帮助安全工程师大幅提升破解效率。 阅读详情

相关推荐

精益六西格玛Python数字化应用开发-Day18 应用场景:家电企业生产效率优化

本文将重点介绍专门针对精益六西格玛黑带使用场景的 Python 库,这些库功能侧重于数据分析和流程优化,特别适用于 DMAIC 方法论和看板管理。考虑到读者具备中高级Python 使用经验,我们将深入探讨各库的高级功能和实际应用应用场景。 某家电企业生产线自动化程度高,数据量巨大,希望通过精益管理提升生产效率。企业借助 Python 脚本,打通各类数据源(MES、ERP、设备日志),自动归集生产数据,分析各工序的生产节拍、设备停机、效率损失,快速定位瓶颈环节

m0_56592100的博客 906

介绍几种使用C/C++语言判断一个文件是否存在的方法

1. 方法一:C语言之access2. 方法二:C++语言之access3. 方法三:C++方法之ifstream4. 方法四:fopen方法5. 方法五:sys中的stat函数方法

非晚非晚的博客 4万+

Frida实战:高效dump Android内存中的so文件与修复技巧

本文详细介绍了使用Frida工具dump Android内存中已解密so文件的实战技巧。针对加固应用静态分析失效的痛点,文章提供了从环境搭建、使用frida_dump脚本自动化抓取内存数据,到利用SoFixer工具修复ELF文件结构的完整流程,帮助逆向分析人员高效获取可分析的so文件。

tt34567的博客 528

【C/C++ 应用开发 检测文件 】详解 C/C++ 中常用的 5 种文件存在检查方式

不再迷茫 && 详解 C/C++ 中常用的 5 种文件存在检查方式

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 4920

Windows沙盒神器Sandboxie Plus保姆级教程:从安装到实战测试可疑软件

本文详细介绍了Windows沙盒神器Sandboxie Plus的安装、配置与实战应用,帮助用户安全测试可疑软件。从系统要求、安装步骤到核心功能如多沙盒管理、文件共享和快照恢复,全面解析了这款轻量级沙盒工具的优势与使用技巧,特别适合需要隔离运行未知程序的用户。

weixin_29323049的博客 1155

Xilinx XDMA驱动代码分析及用法

Xilinx XDMA驱动代码分析及用法 先简单的介绍一下,赛灵思的XDMA的驱动是用于做什么的、他的主要功能就类似与网卡pcie接口的网卡驱动、用于控制主机与fpga设备进行pcie的通讯。通讯的主要方式是设备文件的读写,这里不清楚的同学可以看一下我上一篇文章。通过控制设备文件的读写,操作驱动与fpga设备进行数据传输。 1、目录结构 zacha@Superman:~/nfs/xdma-debug/dma_ip_drivers-master/XDMA/linux-kernel$ tree -C . ├──

恍恍惚惚的大穷猫的博客 3万+

c++ 判断文件是否存在的几种方法

c++ 判断文件是否存在的几种方法

whl0071的专栏 6579

StarUML最新版汉化与破解二合一教程:5分钟搞定永久使用

本文提供StarUML最新版的高效使用指南,涵盖从安装到深度定制的全流程优化方案。包括软件获取最佳实践、界面个性化设置、核心建模技巧、团队协作策略及性能优化建议,帮助架构师和开发团队提升UML建模效率。特别推荐版本控制集成和文档自动化输出方案,适用于各类规模的项目开发。

weixin_42530732的博客 452

C++ - 判断本机文件是否存在的方式总结

C++ - 判断本机文件是否存在的方式总结 由于C++没有像python那样方便的os.path官方库,经常面临着判断一个文件是否在本机上存在都不易用,今天就总结下C++下判断本机文件是否存在的一些方法。 1 通用方法 1.1 使用std::ifstream判断 #include <iostream> #include <fstream> bool Is_File_Exist(const std::string& file_path) { std::ifstream fi

HW140701的博客 5549

机器学习(十九):梯度提升回归(GBR)

机器学习中的梯度提升回归算法原理与案例实战。

全栈川川 5156

Halcon 深度学习实战:PCB 缺陷检测模型的 TensorRT/OpenVino 加速推理

本文介绍了如何利用TensorRT和OpenVino对Halcon深度学习模型进行加速优化,以提升PCB缺陷检测系统的实时性能。文章详细阐述了模型加速框架的选择策略(根据硬件选用TensorRT或OpenVino)、优化流程实施(包括混合精度优化和模型导出)以及加速后的推理实现。实验结果表明,优化后的模型体积缩小40%,推理速度提升2-5倍(GPU环境下从79ms降至38ms,CPU环境下从3804ms降至2152ms),同时保持检测精度。通过完整的代码示例展示了从模型加速到实际部署的全流程,为工业视觉场景

LIN943168247的博客 535

c 判断文件是否存在_C++基础:判断文件是否存在的方法

C++基础:判断文件是否存在的方法使用以下几种函数判断文件是否存在#include <fstream> --> 使用ifstream打开文件流,成功则存在,失败则不存在;#include <stdio.h> --> 以fopen读方式打开文件,成功则存在,否则不存在;#include <unistd.h> --> 使用access函数获取文件状...

weixin_34502439的博客 1574

(10)三相三绕组变压器的建模仿真

建立了三相三绕组变压器组的Simulink仿真模型,通过实例进行了仿真计算。

weixin_45670943的博客 1143

关于C++中如何判断文件,目录存在的若干方法

 在我们平时的编程时,经常需要判断文件或者目录是否存在,相对来说判断文件的存在性比较简单,目录则比较复杂。 下面就详细的介绍几种方法。   首先关于判断文件的存在性: 一、ifstream 在C++中,可以利用ifstream文件输入流,当我们直接使用ifstream来创建文件输入流的时候,如果文件不存在则流创建失败。

570

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

关于C++中如何判断文件、目录存在的若干方法

在我们平时的编程中,经常需要判断文件或者目录是否存在,相对来说判断文件存在比较简单,判断目录存在则比较复杂。 下面就详细的介绍几种方法。 首先,关于判断文件存在的方法: 一、ifstream输入流 在C++中,可以利用ifstream文件输入流,当我们直接使用ifstream来创建文件输入流的时候,如果文件不存在则流创建失败。 ifstream fin("he

WorldMvp的专栏 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Qt C++ 判断文件夹或者文件是否存在的方法

_access函数判断文件夹或者文件是否存在

qq_42815643的博客 1532

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

aspnet: 判断文件是否存在_C++基础:判断文件是否存在的方法

C++基础:判断文件是否存在的方法使用以下几种函数判断文件是否存在#include <fstream> --> 使用ifstream打开文件流,成功则存在,失败则不存在;#include <stdio.h> --> 以fopen读方式打开文件,成功则存在,否则不存在;#include <unistd.h> --> 使用access函数获取文件状...

weixin_39936134的博客 314
上一篇: c++ 不完全类型
下一篇: 动手操作Gtest
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值