云备份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,一经查实,立即删除!

相关文章

Matlab应用层生成简述

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

Vue3组件基础示例

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

windows通过cmd终止线程

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

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

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

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

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

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

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

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【信息】…

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

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

藏不住了!这20个技术点是运维老手的秘密武器

你们好&#xff0c;我的网工朋友。 信息技术系统的正常运行直接关系到企业或生产的正常运行。 然而&#xff0c;网工经常面临以下问题&#xff1a;网络速度慢、设备故障和应用系统效率低。 任何信息技术系统的故障&#xff0c;如果不及时处理&#xff0c;都会产生很大的影响…

P2089 烤鸡、P1706 全排列问题、P1157 组合的输出、P1036 [NOIP2002 普及组] 选数——Python代码实现(带注释)

P2089 烤鸡 题目背景 猪猪 Hanke 得到了一只鸡。 题目描述 猪猪 Hanke 特别喜欢吃烤鸡&#xff08;本是同畜牲&#xff0c;相煎何太急&#xff01;&#xff09;Hanke 吃鸡很特别&#xff0c;为什么特别呢&#xff1f;因为他有 1010 种配料&#xff08;芥末、孜然等&#xf…

【优选算法专栏】专题十六:BFS解决最短路问题(一)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

串口和 蓝牙模块HC08

串口基本认知 串行接口简称串口&#xff0c;也称 串行通信 接口或 串行通讯接口 &#xff08;通常指 COM 接口 &#xff09;&#xff0c;是采用串行通信方 式的 扩展接口 。串行 接口&#xff08;Serial Interface &#xff09;是指数据一位一位地顺序传送。其特点是 通信线路…

优秀企业都在用的企微知识库,再不搭建就晚了!

每个团队都在寻找让工作效率提升的方法。如果你想知道哪些团队能够高效地完成任务&#xff0c;而另一些却步履维艰&#xff0c;那么答案可能就是“企业微信知识库”。见过很多团队都在使用它&#xff0c;而且效果非常显著。如果你还没有搭建属于自己的企微知识库&#xff0c;可…

你真的会写接口自动化测试断言吗?

你真的会写自动化测试断言吗&#xff1f; 在接口测试中&#xff0c;断言是一项非常重要的操作&#xff0c;它是用来校验接口返回结果是否符合预期的一种手段。一般来说&#xff0c;接口测试断言大致可以分为以下几类&#xff1a; 状态码断言&#xff1a;这是最基本也是最常用的…

【C语言】汉诺塔问题

目录 一、何为汉诺塔问题&#xff1f; 二、汉诺塔计算规律 三、打印汉诺塔的移动路径 总结 一、何为汉诺塔问题&#xff1f; 汉诺塔问题是一个经典的问题。汉诺塔&#xff08;Hanoi Tower&#xff09;&#xff0c;又称河内塔&#xff0c;源于印度一个古老传说。大梵天创造世…

BM57 岛屿数量(回溯)

对数组index的判断要放前面&#xff0c;要不然报数组越界异常。 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** 判断岛屿数量* param grid char字符型二维数组 * return …

Unity开发者3D模型基础

术语“3D 建模”是指使用特殊软件创建对象或表面的 3D 数字表示的过程。 3D 模型可用于各种不同的目的&#xff0c;包括电影、视频游戏、建筑和工程。 3D 建模也是创建虚拟现实 (VR) 和增强现实 (AR) 体验工作的重要组成部分。 我们通常通过构建或获取 3D 模型并将其导入 Unit…

ssm028蜀都天香酒楼的网站设计与实现+jsp

基于JSP的蜀都天香酒楼管理系统的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定蜀都…