C++文件路径处理1 - 判断一个文件是否存在|是否可读|是否可写|是否可执行

  • 1. 关键词
  • 2. filesystem.h
  • 3. filesystem_unix.cpp
  • 4. filesystem_win.cpp
  • 5. filepath.h & filepath.cpp
  • 6. 测试代码
  • 7. 运行结果
  • 8. 源码地址

1. 关键词

关键词:

C++ 文件路径处理 文件 是否存在 是否可读 是否可写 是否可执行 跨平台

应用场景:

在对文件进行操作之前,对文件的访问权限进行判断。

2. filesystem.h

#pragma once#include <string>namespace cutl
{bool file_exists(const std::string &filepath);bool file_readable(const std::string &filepath);bool file_writable(const std::string &filepath);bool file_executable(const std::string &filepath);
} // namespace cutl

3. filesystem_unix.cpp

#if defined(_WIN32) || defined(__WIN32__)
// do nothing
#else#include <unistd.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stack>
#include <cstring>
#include <utime.h>
#include <stdlib.h>
#include <sys/time.h>
#include "filesystem.h"
#include "inner/logger.h"namespace cutl
{bool file_exists(const std::string &filepath){return (access(filepath.c_str(), 0) == 0);}bool file_readable(const std::string &filepath){return (access(filepath.c_str(), R_OK) == 0);}bool file_writable(const std::string &filepath){return (access(filepath.c_str(), W_OK) == 0);}bool file_executable(const std::string &filepath){return (access(filepath.c_str(), X_OK) == 0);}
} // namespace cutl#endif // defined(_WIN32) || defined(__WIN32__)

4. filesystem_win.cpp

#if defined(_WIN32) || defined(__WIN32__)#include <io.h>
#include <direct.h>
#include <Windows.h>
#include <stdlib.h>
#include "strutil.h"
#include "filesystem.h"
#include "logger.h"namespace cutl
{// https://learn.microsoft.com/zh-cn/cpp/c-runtime-library/reference/access-waccess?view=msvc-170bool file_exists(const std::string &filepath){return (_access(filepath.c_str(), 0) == 0);}// https://learn.microsoft.com/zh-cn/cpp/c-runtime-library/reference/access-waccess?view=msvc-170bool file_readable(const std::string &filepath){// 04: 只读, 06: 读取和写入return (_access(filepath.c_str(), 4) == 0) || (_access(filepath.c_str(), 6) == 0);}bool file_writable(const std::string &filepath){// 02: 只写, 06: 读取和写入return (_access(filepath.c_str(), 2) == 0) || (_access(filepath.c_str(), 6) == 0);}bool file_executable(const std::string &filepath){CUTL_WARN("executable() is not supported on Windows");return false;}
} // namespace cutl#endif // defined(_WIN32) || defined(__WIN32__)

5. filepath.h & filepath.cpp

参考:

https://gitee.com/spencer_luo/common_util/blob/master/src/common_util/filepath.h https://gitee.com/spencer_luo/common_util/blob/master/src/common_util/filepath.cpp

6. 测试代码

#include "common.hpp"
#include "fileutil.h"void TestPermission()
{PrintSubTitle("TestPermission");auto path = cutl::path("./fileutil_test/file4.data");std::cout << "path: " << path << ", exists: " << path.exists() << std::endl;std::cout << "path: " << path << ", readable: " << path.readable() << std::endl;std::cout << "path: " << path << ", writable: " << path.writable() << std::endl;std::cout << "path: " << path << ", executable: " << path.executable() << std::endl;auto path2 = cutl::path("./script/build.sh");std::cout << "path2: " << path2 << ", executable: " << path2.executable() << std::endl;
}

7. 运行结果

-------------------------------------------TestPermission-------------------------------------------
path: ./fileutil_test/file4.data, exists: 1
path: ./fileutil_test/file4.data, readable: 1
path: ./fileutil_test/file4.data, writable: 1
path: ./fileutil_test/file4.data, executable: 0
path2: ./script/build.sh, executable: 1

8. 源码地址

更多详细代码,请查看本人写的C++ 通用工具库: common_util, 本项目已开源,代码简洁,且有详细的文档和Demo。

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/35598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2的watch详解。真的是服了这个watch有bug

在 Vue.js 2 中&#xff0c;watch 是一个用来观察和响应 Vue 实例数据变动的选项。它可以用来监听数据的变化并执行相应的逻辑&#xff0c;比如在数据变化时更新界面或者执行一些异步操作。 基本用法 监听单个数据源 最简单的用法是监听单个数据源&#xff08;即一个数据属性…

观成科技:证券行业加密业务安全风险监测与防御技术研究

摘要&#xff1a;解决证券⾏业加密流量威胁问题、加密流量中的应⽤⻛险问题&#xff0c;对若⼲证券⾏业的实际流量内容进⾏调研分析&#xff0c; 分析了证券⾏业加密流量⾯临的合规性⻛险和加密协议及证书本⾝存在的⻛险、以及可能存在的外部加密流量威 胁&#xff0c;并提出防…

[JS面试题]面试官:实现一个调度器,最多只能同时有两个任务同时进行

[JS面试题]面试官&#xff1a;实现一个调度器&#xff0c;最多只能同时有两个任务同时进行 这个调度器的工作方式是&#xff0c;它会持续检查任务队列&#xff0c;并且每次最多启动两个任务。当一个任务完成&#xff08;无论是成功还是失败&#xff09;时&#xff0c;它会立即…

PHP 超级全局变量详解

在PHP编程中&#xff0c;超级全局变量&#xff08;Super Global Variables&#xff09;是一种特殊的变量&#xff0c;可以在脚本的任何地方访问&#xff0c;而不受作用域限制。它们被设计用于在不同的脚本文件、函数和类之间共享数据&#xff0c;是PHP语言中非常重要和实用的特…

Knife4j 2.2.X 版本 swagger彻底禁用

官方文档配置权限&#xff1a;https://doc.xiaominfo.com/v2/documentation/accessControl.html#_3-5-1-%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E5%B1%8F%E8%94%BD%E8%B5%84%E6%BA%90 通常有时候我们碰到的问题如下&#xff1a; 在开发Knife4j功能时,同很多开发者经常讨论的问…

c语言预处理和可变参数的使用

概述 预处理名称意 义#define宏定义#undef撤销已定义过的宏名#include使编译程序将另一源文件嵌入到带有#include 的源文件中#if如果条件为真&#xff0c;则执行相应操作#elif如果前面条件为假&#xff0c;而该条件为真&#xff0c;则执行相应操作#else如果前面条件均为假&…

MySQL数据库简介和安装

文章目录 一、数据库原理目前情况数据库的发展史RDBMS关系型数据库关系型数据库理论 二、MySQL历史发展历程关系型数据库和非关系型数据库 三、安装mysql及优化yum安装编译安装mysql二进制安装优化操作 四、 安装mycli插件客户端工具 一、数据库原理 目前情况 我们正处于一个…

考研:数学一/二 和英语一/二 有什么区别

考研数学一/二 区别&#xff1a; 考试内容&#xff1a; 数学一&#xff1a;考查内容包括高等数学、线性代数、以及概率论与数理统计&#xff0c;覆盖的知识面较为全面&#xff0c;题目难度也相对较高。数学二&#xff1a;考试内容包含高等数学和线性代数&#xff0c;不包括概率…

聚观早报 | 真我GT6官宣;iQOO 13参数细节曝光

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 6月26日消息 真我GT6官宣 iQOO 13参数细节曝光 苹果iPadOS 18 Beta 2更新 一加Ace 3 Pro散热细节曝光 亚马逊秘…

Redis-主从复制-配置主从关系

文章目录 1、修改配置文件中的 bind ,注释该配置,取消绑定仅主机登录2、修改protected-mode 为no,取消保护模式3、查看redis的进程状态4、配置6380是6379的从机5、配置6381是6379的从机6、查看主机 6379 的主从信息 1、修改配置文件中的 bind ,注释该配置,取消绑定仅主机登录 …

【MySQL】(基础篇十七) —— 存储过程

存储过程 本文将介绍什么是存储过程&#xff0c;为什么要使用存储过程以及如何使用存储过程&#xff0c;并且介绍创建和使用存储过程的基本语法。 MySQL的存储过程是预编译的SQL语句集合&#xff0c;它们作为一个可执行单元存储在数据库中。存储过程能够封装复杂的业务逻辑&a…

leetcode-19-回溯

引自代码随想录 [77]组合 给定两个整数 n 和 k&#xff0c;返回 1 ... n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4]] 1、大致逻辑 k为树的深度&#xff0c;到叶子节点的路径即为一个结果 开始索引保证不重复…

1.1章节print输出函数语法八种 使用和示例

1.打印变量和字符串 2-4.三种使用字符串格式化 5.输出ASCLL码的值和中文字符 6.打印到文件或其他对象&#xff08;而不是控制台&#xff09; 7.自定义分隔符、和换行符和结束符 8.连接符加号连接字符串 在Python中&#xff0c;print() 函数用于在控制台上输出信息。这是一个非常…

docker原理记录C-N-A

docker原理 容器技术的兴起源于 PaaS 技术的普及 Docker 项目通过“容器镜像”&#xff0c;解决了应用打包这个根本性难题容器本身没有价值&#xff0c;有价值的是“容器编排”Cgroups 和 Namespace Cgroups 技术是用来制造约束的主要手段&#xff0c;而Namespace 技术则是用…

CRM软件:如何提升团队的销售效率?

销售是企业的驱动力。如果没有一支强大的销售团队&#xff0c;企业很难在当今激烈的竞争中发展壮大并取得成功。为了确保成功&#xff0c;企业需要专注于提高销售效率。 但销售效率到底是什么&#xff1f;企业如何优化和衡量其成功与否&#xff1f;本文将详细解答这些问题。 …

兴趣爱好广泛的人,如何填报高考志愿选专业?

一般来说&#xff0c;高考填报志愿都要以自己的兴趣为基础。但是对于有一些比较优秀的同学来说&#xff0c;自己的兴趣可能是非常广&#xff0c;涉及到各个专业方方面面。有些同学琴棋书画样样精通&#xff0c;对于很多的专业&#xff0c;他们都充满了兴趣&#xff0c;而且兴趣…

Java-方法引用

方法引用概念 把已经有的方法拿过来用&#xff0c;当做函数式接口中抽象方法的方法体 前提条件 1、引用处必须是函数式接口 2、被引用的方法必须已经存在 3、被引用方法的形参和返回值 需要跟抽象方法保持一致 4、被引用方法的功能要满足当前需求 方法引用格式示例 方…

第四天 怎么又迟到了呀 哎啥时候来准时上个课呀

泛型编程 Traits实现&#xff0c;是什么 泛型编程&#xff08;Generic Programming&#xff09;是一种通过编写与特定类型无关的代码来实现代码复用和抽象的编程范式。 在C中&#xff0c;模板&#xff08;Templates&#xff09;是实现泛型编程的主要手段。 Traits&#xff0…

一文入门CMake

我们前几篇文章已经入门了gcc和Makefile&#xff0c;现在可以来玩玩CMake了。 CMake和Makefile是差不多的&#xff0c;基本上是可以相互替换使用的。CMAke可以生成Makefile&#xff0c;所以本质上我们还是用的Makefile&#xff0c;只不过用了CMake就不用再写Makefile了&#x…

【ajax实战05】文章封面发布

一&#xff1a;实现效果 二&#xff1a;实现步骤 1 准备标签结构和样式 html结构样式 <div class"cover"><label for"img">封面&#xff1a;</label><label for"img" class"place"></label><inpu…