⚡文件工具类⚡
admin
2024-03-19 09:15:46
0

目录

🌳.文件工具类的介绍

🌳.文件工具类的功能简介

🌳.stat接口

🍎. 获取文件的大小

🍎.判断文件是否存在

🍎.获取文件最后一次进入时间

🍎.获取文件最后一次修改时间

🌳.获取文件名

🌳.获取文件的内容

🌳.往文件中写入内容

🌳.获取目录下所有文件的相对路径

🌳.压缩文件

🌳.解压文件

🌳.删除文件


🌳.文件工具类的介绍

文件工具类主要是创建一个文件对象将磁盘上的一个文件关联起来,方便对该文件进行操作和获取文件的信息等操作,包括获取文件的内容文件的大小,文件的访问时间,往文件中写入内容等操作。

🌳.文件工具类的功能简介

  • 获取文件的大小
  • 判断文件是否存在
  • 获取文件最后一次进入时间
  • 获取文件最后一次修改时间
  • 获取文件名
  • 获取文件名
  • 获取文件的内容
  • 往文件中写入内容
  • 获取目录下所有文件的相对路径
  • 压缩文件
  • 解压文件
  • 删除文件

文件的 成员变量是filename,它存储程序能够访问到文件的相对路径绝对路径,通过filename能够对文件进行各种操作。

   class FileUtil{private:std::string filename;public:FileUtil(const char* str){                                                          filename=str;}FileUtil(const std::string s){filename=s;}size_t GetFileSize();       //获取文件大小size_t GetFileAccessTime() ;//获取文件最后一次访问时间size_t GetFileModfityTime();//获取文件最后一次修改时间std::string GetFilename();  //获取文件名bool Exist();               //判断文件是否存在bool SetContent(std::string& body);//往文件中写入body的内容bool GetContent(std::string& body);//获取文件内容,将文件内容放入body中//获取文件的部分内容bool GetPosContent(size_t pos,size_t n,std::string& body);bool Remove();//删除文件//压缩文件,压缩文件名为packnamebool PackFile(const std::string&packname);//解压缩文件,解压缩文件名为packnamebool UnpackFile(const std::string& unpackname);//获取目录下的所有文件的相对路径bool GetPathInDir(std::vector& arry);//创建目录bool CreateDir(std::string& dirname);};

🌳.stat接口

stat接口可以直接判断文件是否存在,直接获取到文件的大小,文件最后一次进入时间,文件最后一次修改时间

 stat接口通过文件相对路径或者绝对路径来访问到文件,获取到文件属性信息.

int stat(const char *path, struct stat *buf);

返回值: 如果通过文件路径找不到文件,则返回-1,找到了返回0.

文件的属性信息存储到struct stat对象中,struct stat结构体的成员有:
 

           struct stat {dev_t     st_dev;     /* 包含文件的设备IDe */ino_t     st_ino;     /* inode number */mode_t    st_mode;    /* protection */nlink_t   st_nlink;   /* 硬链接数 */uid_t     st_uid;     /* 文件所用者的ID*/gid_t     st_gid;     /* 文交所属组的ID */dev_t     st_rdev;    /* 设备ID */off_t     st_size;    /* 文件的总大小*/blksize_t st_blksize; /* 文件系统I/O的块大小 */blkcnt_t  st_blocks;  /* 分配的512B块数 */time_t    st_atime;   /* 最后一次进入的时间 */time_t    st_mtime;   /* 最后一次访问的时间 */time_t    st_ctime;   /* 上次状态更改时*/};

🍎. 获取文件的大小

size_t sjp::FileUtil::GetFileSize(){    struct stat buf;    if(stat(filename.c_str(),&buf)==-1){    cout<<"GetFileSize fail.."<

🍎.判断文件是否存在

bool sjp::FileUtil::Exist(){struct stat buf;if(stat(filename.c_str(),&buf)==-1){return false; }return true;
}

🍎.获取文件最后一次进入时间

size_t sjp::FileUtil::GetFileAccessTime(){    struct stat buf;    if(stat(filename.c_str(),&buf)==-1){    cout<<"GetFielAccessTime fail.."<

🍎.获取文件最后一次修改时间

size_t sjp::FileUtil::GetFileModfityTime(){    struct stat buf;    if(stat(filename.c_str(),&buf)==-1){    cout<<"GetFileSize fail.."<

🌳.获取文件名

功能:

FIleUtil中filename存储的时路径,GetFilename的功能仅仅获取文件名,例如文件的路径是wwwroot/filename,获取文件名就是filename.

std::string sjp::FileUtil::GetFilename(){size_t pos=filename.rfind("/");if(pos==std::string::npos){return filename;}return filename.substr(pos+1);
}

🌳.获取文件的内容

功能:

GetPosContent 获取FileUtil中的文件中从pos位置到pos+n的数据,获取到的文件数据存储在body中.

//获取文件的部分内容
bool sjp::FileUtil::GetPosContent(size_t pos,size_t n,std::string& body){if(!Exist()){cout<<"GetPostContent: file is not exist"<
  • ifstream对象能够将文件中的数据关联起来,并可以读取文件中的内容。
  • ifs.seekg(pos,std::ios::beg) :将文件从起始位置偏移到pos的位置

🌳.往文件中写入内容

功能:

SetContent将body中的数据写入到FileUtil关联的文件中。

bool sjp::FileUtil::SetContent(std::string& body)
{//打开文件将文件与ofs关联起来std::ofstream ofs;ofs.open(filename,std::ios::binary);//将body的数据写入文件中ofs.write(body.c_str(),body.size());if(ofs.good()==false){cout<<"FileUtil.cpp 52 line:SetContent failing"<
  • ofstream对象能够与文件进行关联起来,并可以往文件中写入数据

🌳.获取目录下所有文件的相对路径

功能:

如果FileUtil存储的是一个目录,GetPathInDir可以获取到目录下的所有文件的相对路径。

#include 
namespace fs = std::experimental::filesystem;
bool sjp::FileUtil::GetPathInDir(std::vector& arry)
{for(auto & p:fs::directory_iterator(filename)){arry.push_back(p.path().relative_path());}return true;
}
  • 获取目录下所有文件信息,需要使用c++17中的目录迭代器,目录迭代器能够目录下所有的文件信息.
  • 迭代器获取到的文件信息存放在directory_entry对象里面,在directory_entry类中包括一个path的类型的变量,path类里面有一个relative_path接口。这个接口是获取文件的相对路径
  • 使用c++17的目录迭代器需要包含filesystem文件。
  • 如果使用g++编译器,需要在编译指令中添加-lstdc++fs,例如:
g++ -o main main.cc FileUtil.cpp  -std=c++11 -lstdc++fs -g 

🌳.压缩文件

功能:

将FileUtil对象中的文件进行压缩,压缩的文件为packname

bool sjp::FileUtil::PackFile(const std::string& packname)
{//将打开文件std::ifstream ifs;ifs.open(filename.c_str(),std::ios::binary);ifs.seekg(0,ifs.end);int size=ifs.tellg();ifs.seekg(0,ifs.beg);//将文件信息往提取到文件中std::string body;body.resize(size);ifs.read(&body[0],size);//压缩文件       std::string packed=bundle::pack(bundle::LZIP,body);                                            std::ofstream ofs;    ofs.open(packname.c_str());    ofs.write(&packed[0],packed.size());    ofs.close();    ifs.close();     return true;
}

压缩文件需要使用bundle库中接口,bundle的具体使用在下面这篇文章中有详细解析:

bundle文件压缩库的使用 

🌳.解压文件

功能:

将FileUtil对象中的文件进行解压缩,压缩的文件为unpackfile.

bool sjp::FileUtil::UnpackFile(const std::string& unpackfile){    std::ifstream ifs;        ifs.open(filename.c_str(),std::ios::binary);        ifs.seekg(0,ifs.end);        int size=ifs.tellg();        ifs.seekg(0,ifs.beg);    std::string body;                                                        body.resize(size);                                                  ifs.read(&body[0],size);                                            std::string unpacked=bundle::unpack(body);      std::ofstream ofs;    ofs.open(unpackfile.c_str(),std::ios::binary);    ofs.write(unpacked.c_str(),unpacked.size());    ifs.close();    ofs.close();    return true;    
}    

解压缩文件也是需要使用bundle库中接口。

🌳.删除文件

功能:

删除FileUtil中的文件

bool sjp::FileUtil::Remove(){remove(filename.c_str());return true;
}

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...