在我参与的项目中,使用了boost.filesystem进行文件操作。boost.filesystem在发生错误的时候会抛出异常,但是在大部分情况下这些异常是可以忽略的,例如,在检查文件是否存在的时候,发生错误可以等同于文件不存在。虽然boost.filesystem也提供了重载函数,通过输出参数返回错误来代替异常,但是在每个调用点都得定义一个输出参数,稍显麻烦。所以,为了简化客户代码,我们实现了一些包装函数,如下所示:

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

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

这个函数一直都很正常,直到最近有用户反馈,当发送OneDrive同步文件夹中的文件时,会出现文件不存在的提示,而这个文件明明是存在的。经过排查,我发现当OneDrive开启了“按需文件”功能时,boost::filesystem::is_regular_file对于同步文件夹中的文件会返回false。这个功能的设置界面如下图所示:

当开启了“按需文件”功能时,OneDrive中的文件信息会同步到本地文件系统中,但文件内容不会立即同步,只有真正用到文件内容时才会同步下来。这样一来可以节省本地的硬盘空间。并不是所有Windows系统都支持该功能,只有安装了2017年10月份发布的秋季更新的Windows 10系统才可以。

显然,当OneDrive中的文件还没有将内容同步下来时,它并不算是一个“常规文件”,难怪boost::filesystem::is_regular_file会返回false。事实上,用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;}

首先,通过boost::filesystem::status获取文件的信息,如果发生错误,则认为文件不存在。然后,使用boost::filesystem::exists判断文件是否存在,该函数不区分文件夹和文件,所以最后还要使用boost::filesystem::is_directory判断一下是否文件夹,只要不是文件夹,都认为文件是存在的。

vb6如何判断文件是否存在_使用boost.filesystem检查文件是否存在的正确姿势相关推荐

  1. python逐个读取文件并处理_逐个读取多个文件并用python进行处理

    我在python中使用Pybrain(神经网络库)进行图像处理.我在一个目录中有196个文件,它保存在下面代码中的所有_文件中.我试着打开每个文件并分别对每个文件进行处理,但它将所有文件数据放在一个字 ...

  2. jsp文件上传_猿蜕变系列7——也说说springMVC上传姿势

    看过之前的蜕变系列文章,相信你对springMVC有了一定的认识.对springMVC的异常处理,也有了一定的认识.今天我们来开启新讨论,讲一讲web开发中会经常遇到的一个功能,文件上传. 猿蜕变同样 ...

  3. vue单文件props写法_详解Vue 单文件组件的三种写法

    详解Vue 单文件组件的三种写法 JS构造选项写法 export defaul { data, methods, ...} JS class写法 @Component export default c ...

  4. python怎么创建文件夹视频_怎么用python创建文件夹

    Python中创建文件夹的方法:import os def mkdir(path): folder = os.path.exists(path) if not folder:              ...

  5. 微信文件夹的dat文件怎么打开_如何打开微信dat文件基本方法

    微信dat转码软件使用操作说明在线解码,各位同学下载软件后,如何操作?如何找到dat文件?如何使用?又有哪些注意事项呢?这里会为大家一一道来.问题1 :如果下载失败怎么办?请先检查网络,软件并没有放在 ...

  6. python文件读写库_【8】python文件的读写方法

    (1).读文件的步骤: (1)打开文件 open(path,flag,encoding,[errors]) path:打开路径 flag:打开方式 r(只读) rb(二进制格式) r+(可以读写) w ...

  7. oracle体系三大文件,oracle 体系_第三章控制文件

    第三章 控制文件 1.功能特点 记录数据库当前的物理状态 维护数据库的一致性,是一个二进制的小文件 在mount阶段被读取,记录rman备份的元数据 查看database控制文件的位置 Show pa ...

  8. arctime工程文件怎么打开_微信dat后缀的文件怎么打开

    电脑微信image 下的dat文件都是图片进行加密后的文件.需要将dat文件解密回图片才可以查看. 原理:将图片的字节通过加密值进行异或,然后将异或后的数据重新存储到dat文件中.所以,如果解密的话, ...

  9. java建立新文件保存数据_关于java中创建文件,并且写入内容

    packagecom.file.run;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;im ...

最新文章

  1. 为什么说机器学习是预防欺诈的最佳工具?
  2. 资深数据大牛深度解析:大数据底层架构!
  3. [route]Add up route for deb rpm and windows / 为RPM系DEB系和Windows添加路由
  4. mysql调试.net_需要有关使用.NET和MySQL调试应用程序的帮助
  5. CSS浏览器兼容性----Hack
  6. JS 封装事件(鼠标事件举例)-封装引入部分
  7. mybatis-plus中like的使用说明
  8. JS/JQUERY函数库
  9. 基于神经网络的实体识别和关系抽取联合学习
  10. Unity 随机生成中文名字
  11. oracle方案对象有表空间吗,oracle数据库中,实例、表空间、用户、方案、表、数据的关系例子...
  12. install Oracle JDK in Linux:安装oracle JDK in linux
  13. 记录origin画图遇到的问题及其软件bug解决
  14. 中国石油大学(北京)-《 油层物理》第二阶段在线作业
  15. 涉密学位论文不得在联网的计算机上撰写,华南理工大学涉密学位论文管理暂行规定...
  16. 用图形界面实现过独木桥问题
  17. php trie,数据结构-PHP 字典树(Trie)的实现
  18. 如何恢复删除的数据(以损坏的U盘为例)
  19. java实现环形链表解决约瑟夫环问题
  20. 电器产品为什么要过安规认证?这些安规知识你了解吗

热门文章

  1. 曾经“杀手级”的桌面语言 Java 将要退隐江湖?
  2. B站校招面试官“炫耀资产、贬低应试者”?当事人发长文回应,北邮学子要求向学校道歉...
  3. 抖音诉腾讯不正当竞争案撤诉;微信更新,表情包上限999个;PyTorch 1.8.1 发布 | 极客头条...
  4. Java 第一大框架:Spring 的 IoC 跟 AOP 雏形如何实现?
  5. 揭秘 AWS 基础架构底层运维和构建之道!
  6. 微信群有人发广告?用 Python 写自动化机器人消灭他!
  7. 监控系统选型,这篇不可不读
  8. ​炸裂!万字长文拿下 HTTP 我在字节跳动等你!
  9. 为什么大厂都在用 GO 语言?读透 GO 语言的切片
  10. 阿里工程师手把手教你设计 B 端垂类营销中心!