云备份day04

📟作者主页:慢热的陕西人

🌴专栏链接:C++云备份项目

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

主要内容介绍了文件工具了类的实现

在这里插入图片描述

文章目录

  • 云备份day04
    • 1.文件实用工具类
      • 1.1文件实用工具类的整体框架
      • 1.2文件工具类的实现
        • 1.2.1文件属性和名称获取
        • 1.2.2文件的读写操作
        • 1.2.3文件的解压缩
        • 1.2.4目录的操作

云备份day04

1.文件实用工具类

1.1文件实用工具类的整体框架

class
{
private:std::string filename;
public: size_t FileSize(); // 1.获取文件大小time_t LastMTime();// 获取文件最后一次修改时间time_t LastATime();// 获取文件最后一次访问时间std::string FileName();//获取文件路径名中的文件名称 /abc/test.txt -> test.txtstd::string FileName();                                        // 获取文件的名称bool SetContent(const std::string &body); // 向文件写入数据bool GetContent(std::string *body)   //从文件中读取数据bool GetPosLen(std::string *body, size t pos, size t len); // 获取文件指定位置 指定长度的数据bool Exists();        // 判断文件是否存在bool CreateDirectory();   // 创建目录bool GetDirectory(std::vector<std::string> *arry);  // 浏览获取目录下所有文件路径名bool Compress(const std::string &packname);         // 压缩文件bool UnCompress(const std::string &filename);       // 解压缩文件
}

1.2文件工具类的实现

1.2.1文件属性和名称获取

struct stat 是在 C 和 C++ 中用来获取文件或文件系统状态信息的结构体。它通常用于系统编程和文件操作中,可以提供有关文件的诸多属性。

下面是 struct stat 结构体的一般定义:

struct stat {dev_t         st_dev;         // 设备 IDino_t         st_ino;         // i 节点号mode_t        st_mode;        // 文件模式nlink_t       st_nlink;       // 链接数uid_t         st_uid;         // 用户 IDgid_t         st_gid;         // 组 IDdev_t         st_rdev;        // 特殊设备 IDoff_t         st_size;        // 文件大小(字节数)blksize_t     st_blksize;     // 文件系统 I/O 缓冲区大小blkcnt_t      st_blocks;      // 文件所占块数struct timespec st_atim;      // 最后一次访问时间struct timespec st_mtim;      // 最后一次修改时间struct timespec st_ctim;      // 最后一次状态变化时间...
};

这里列出了一些常用的成员,但实际上 struct stat 可能会包含更多的成员,具体取决于操作系统和文件系统的支持。

下面是一些常用的 struct stat 成员:

  • st_dev:文件所在设备的设备号。
  • st_ino:文件的 i 节点号。
  • st_mode:文件的权限和文件类型。
  • st_nlink:文件的硬链接数。
  • st_uid:文件所有者的用户 ID。
  • st_gid:文件所有者的组 ID。
  • st_size:文件大小(以字节为单位)。
  • st_blksize:文件系统 I/O 缓冲区大小。
  • st_blocks:文件所占的块数。
  • st_atimst_mtimst_ctim:文件的最后访问时间、修改时间和状态变化时间。

通过 stat()fstat() 等系统调用,可以填充 struct stat 结构体并获取文件的各种信息。这些信息可以用于程序中进行文件操作、权限检查等。

        FileUtil(const string &filename):_filename(filename){}// 1.获取文件大小int64_t FileSize(){struct stat st;if(stat(_filename.c_str(), &st) < 0){cout << "Got file size failed!" << endl;return -1;}return st.st_size;}// 获取文件最后一次修改时间                                        time_t LastMTime(){struct stat st;if (stat(_filename.c_str(), &st) < 0){cout << "Got file size failed!" << endl;return -1;}return st.st_mtime;}      // 获取文件最后一次访问时间                                    time_t LastATime(){struct stat st;if (stat(_filename.c_str(), &st) < 0){cout << "Got file size failed!" << endl;return -1;}return st.st_atime;}          // 获取文件的名称 /abc/test.txt -> test.txt                           std::string FileName(){size_t pos = _filename.find_last_of("/");if(pos == std::string::npos){return _filename;}return _filename.substr(pos+1);}  
1.2.2文件的读写操作
        // 获取文件指定位置 指定长度的数据bool GetPosLen(std::string *body, size_t pos, size_t len){size_t fsize = this->FileSize();if(pos + len > fsize){std::cout << "get file len is error\n";return false;}std::ifstream ifs;ifs.open(_filename, std::ios::binary);if(ifs.is_open() == false){std::cout << "read open file failed\n";return false;}ifs.seekg(pos, std::ios::beg);body->resize(len);ifs.read(&(*body)[0], len);if(ifs.good() == false){std::cout << "read file is failed\n";ifs.close();return false;}ifs.close();return true;}// 从文件中读取数据bool GetContent(std::string* body){size_t fsize = this->FileSize();return GetPosLen(body, 0, fsize);}// 向文件写入数据                                      bool SetContent(const std::string &body){std::ofstream ofs;ofs.open(_filename, std::ios::binary);if(ofs.is_open() == false) {std::cout << "write open file error\n";return false;}ofs.write(&body[0], body.size());if(ofs.good() == false){std::cout << "write file error\n";ofs.close();return false;}ofs.close();return true;}               
1.2.3文件的解压缩
        // 压缩文件bool Compress(const std::string &packname){//1.获取源文件的数据std::string body;if(this->GetContent(&body) == false){std::cout << "Compress GerContent failed\n";return false;}//2.对数据进行压缩std::string packed = bundle::pack(bundle::LZIP, body);//3.将压缩后的数据存储在压缩包文件中FileUtil fu(packname);if(fu.SetContent(body) == false){std::cout << "Compress SetContent error\n";return false;}return true;}    // 解压缩文件                bool UnCompress(const std::string &filename){//将当前压缩包的数据读取出来std::string body;if(this->GetContent(&body) == false){std::cout << "Uncompress GetContent error\n";return false;}//解压数据std::string unpacked = bundle::unpack(body);//将解压后的数据放入到filename中FileUtil fu(filename);if(fu.SetContent(unpacked) == false){std::cout << "Uncompress Setcontent error\n";return false;}return true;}
1.2.4目录的操作
        // 判断文件是否存在bool Exists(){return fs::exists(_filename);}// 创建目录                                              bool CreateDirectory(){if(this->Exists()) return true;else return fs::create_directories(_filename);}            // 浏览获取目录下所有文件路径名                        bool ScanDirectory(std::vector<std::string> *arry){for(auto& p : fs::directory_iterator(_filename)){if(fs::is_directory(p) == true){continue;}//relative.path带有路径的文件名arry->push_back(fs::path(p).relative_path().string());}return true;}

到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

在这里插入图片描述

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

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

相关文章

掌握Go语言:Go语言精细错误,清晰、高效的错误处理实践(32)

错误处理是任何编程语言中都至关重要的一部分&#xff0c;Go 语言提供了一套简单而强大的错误处理机制&#xff0c;使得处理错误变得高效而清晰。 Go 错误类型 在 Go 中&#xff0c;错误是一个普通的接口类型&#xff0c;即 error 接口&#xff0c;其定义如下&#xff1a; t…

Matlab应用层生成简述

基础软件层 目前接触到的几款控制器&#xff0c;其厂商并没有提供simulink的基础软件库一般为底层文件被封装为lib&#xff0c;留有供调用API接口虽然能根据API接口开发基础软件库&#xff0c;但耗费时间过长得不偿失 应用层 所以可以将应用层封装为一个子系统&#xff0c;其…

Vue3组件基础示例

组件是vue中最推崇的&#xff0c;也是最强大的功能之一&#xff0c;就是为了提高重用性&#xff0c;减少重复性的开发。 如何使用原生HTML方法实现组件化 在使用原生HTML开发时&#xff0c;我们也会遇到一些常见的功能、模块&#xff0c;那么如何在原生HTML中使用组件化呢&am…

Android OkHttp

目录 1.build.gradle 2.基本使用 3.POST请求 4.Builder构建者 1.build.gradle implementation("com.squareup.okhttp3:okhttp:4.12.0") 2.基本使用 GET同步请求 public void getSync(View view) {new Thread(){Overridepublic void run() {Request request …

C语言初阶--12数组

文章目录 二维数组的创建和初始化二维数组的创建二维数组的初始化二维数组的使用二维数组在内存中的存储 数组越界数组作为函数参数冒泡排序函数数组名是什么&#xff1f; 二维数组的创建和初始化 二维数组的创建 //数组创建 int arr[3][4]; double arr[2][4]; 二维数组的初始…

HTML中meta标签的作用

1.搜索引擎优化 通过设置关键词&#xff08;keywords&#xff09;、描述&#xff08;description&#xff09;等属性&#xff0c;帮助搜索引擎更好地理解网页内容&#xff0c;从而提高网页在搜索结果中的排名 2.定义页面使用的语言 通过charset属性指定文档的字符集&#xff0…

windows通过cmd终止线程

1、使用 netstat 命令查看特定端口的占用情况。例如&#xff0c;要查看端口号为 8080 的情况&#xff0c;可以执行以下命令&#xff1a; netstat -ano | findstr :9009这将显示所有占用端口 9009的网络连接&#xff0c;并列出 PID&#xff08;进程标识符&#xff09;。 2、终止…

Spring Security——10,其他权限校验方法

其他权限校验方法 一、hasAnyAuthority方法二、hasRole方法三、hasAnyRole方法一键三连有没有捏~~ 前面都是使用PreAuthorize注解&#xff0c;然后在在其中使用的是hasAuthority方法进行校验。 SpringSecurity还为我们提供了其它方法例如&#xff1a;hasAnyAuthority&#xff…

Steam上线真人乙游,女性玩家还愿意买单吗?

Steam上线了一款真人乙游《糟糕&#xff01;他们太爱我了怎么办&#xff1f;》&#xff08;以下简称《糟糕&#xff01;&#xff09;。 乍一听这个游戏名&#xff0c;似乎和《完蛋&#xff01;我被美女包围了&#xff01;》有异曲同工之妙&#xff0c;事实也确实如此&#xff…

data-diff,一个超强的 Python 库!

目录 前言 安装 特性 基本功能 字典比较 列表比较 集合比较 嵌套数据结构比较 高级功能 比较忽略特定字段 自定义差异显示 数据快照比较 实际应用场景 数据监测和审计 配置管理 测试验证 总结 前言 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - data-diff …

2024使用VMware® Workstation 17 Pro部署Ubuntu22.04

官网下载镜像 https://ubuntu.com/download/server&#xff0c;配置好vmware的NAT网络。 常用设置 # root用户登录设置&#xff0c;用 sudo 也一样。 sudo passwd root vi /etc/ssh/sshd_config systemctl restart sshdVMware的网络问题 # 遇到的问题 # 1.明明显示已经连上…

挑战30天C++基本入门(DAY8--树)[part 3](速通哦~)

#上一章我们把搜索二叉树的知识给传授完毕&#xff0c;如果认真的看下去并且手打了几遍&#xff0c;基本上内部的逻辑还是可以理解的&#xff0c;那我们现在就截至继续学习树的一些重要知识啦~~ 树高怎么求呀&#xff1f;如果用上一次学的层次遍历来求树高&#xff0c;有点小题…

SeLinux安全上下文文件

在SeLinux 框架中&#xff0c;需要为每个主体和客体设置好安全上下文。在Android中&#xff0c;常见的安全上下文文件有file_contexts、genfs_contexts、service_contexts、mac_permissions.xml和seapp_contexts file_contexts 根系统中所有文件的安全上下文&#xff0c; 如/…

Redis分布式锁的实现核心思路

4.2 、Redis分布式锁的实现核心思路 实现分布式锁时需要实现的两个基本方法&#xff1a; 获取锁&#xff1a; 互斥&#xff1a;确保只能有一个线程获取锁非阻塞&#xff1a;尝试一次&#xff0c;成功返回true&#xff0c;失败返回false 释放锁&#xff1a; 手动释放超时释放&…

面试篇:杂乱篇

String s " "; 1. String类的常用方法有哪些&#xff1f; s.length()&#xff1a; 返回字符串长度s.substring()&#xff1a; 截取字符串s.split()&#xff1a; 分割字符串s.equlas()&#xff1a; 字符串比…

ubuntu18.04-arm7v架构下构建Telegraf自定义系统服务

ubuntu18.04-arm7v架构下构建Telegraf自定义系统服务 通过交叉编译后的Telegraf可执行文件使用nohup启动后&#xff0c;在系统重启时&#xff0c;有时候会忘记再把它启动起来。这个时候我们就可以将其定义成系统服务&#xff0c;让系统来帮忙管理。 创建telegraf.service文件 …

Chapter 1 Basic Concepts of Communication and Communication Systems

1.1 The Concept of Communication communication【通信】:It is the process of using signals to transmit messages containing information in space. To put it simply, communication is the spatial transmission of information【信息的空间传递】Information【信息】…

linux CentOS7配置docker的yum源并安装

[TOC](这里写目录标题 配置yum源Docker的自动化安装一些其他启动相关的命令&#xff1a; 配置yum源 使用以下命令下载CentOS官方的yum源文件 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 清除yum缓存 yum clean all 更新yum缓存…

上升Chrome安装Vue插件vue-devtools

Chrome安装Vue插件vue-devtools的步骤如下&#xff1a; 打开Chrome浏览器&#xff0c;点击地址栏右侧的三个点图标&#xff0c;选择“更多工具”->“扩展程序”。在打开的扩展程序页面&#xff0c;点击右上角的“打开Chrome网上应用店”。在Chrome网上应用店中搜索“Vue De…

【JavaWeb】Day35.MySQL概述——数据库设计-DDL(二)

表操作 关于表结构的操作也是包含四个部分&#xff1a;创建表、查询表、修改表、删除表。 1.创建 语法 create table 表名( 字段1 字段1类型 [约束] [comment 字段1注释 ], 字段2 字段2类型 [约束] [comment 字段2注释 ], ...... 字段n 字段n类型 [约束] [comment …