• ⚡文件工具类⚡


    目录

    🌳.文件工具类的介绍

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

    🌳.stat接口

    🍎. 获取文件的大小

    🍎.判断文件是否存在

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

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

    🌳.获取文件名

    🌳.获取文件的内容

    🌳.往文件中写入内容

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

    🌳.压缩文件

    🌳.解压文件

    🌳.删除文件

    🚀.Json工具类



    🌳.文件工具类的介绍

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

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

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

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

    1. class FileUtil{
    2. private:
    3. std::string filename;
    4. public:
    5. FileUtil(const char* str){
    6. filename=str;
    7. }
    8. FileUtil(const std::string s){
    9. filename=s;
    10. }
    11. size_t GetFileSize(); //获取文件大小
    12. size_t GetFileAccessTime() ;//获取文件最后一次访问时间
    13. size_t GetFileModfityTime();//获取文件最后一次修改时间
    14. std::string GetFilename(); //获取文件名
    15. bool Exist(); //判断文件是否存在
    16. bool SetContent(std::string& body);//往文件中写入body的内容
    17. bool GetContent(std::string& body);//获取文件内容,将文件内容放入body中
    18. //获取文件的部分内容
    19. bool GetPosContent(size_t pos,size_t n,std::string& body);
    20. bool Remove();//删除文件
    21. //压缩文件,压缩文件名为packname
    22. bool PackFile(const std::string&packname);
    23. //解压缩文件,解压缩文件名为packname
    24. bool UnpackFile(const std::string& unpackname);
    25. //获取目录下的所有文件的相对路径
    26. bool GetPathInDir(std::vector& arry);
    27. //创建目录
    28. bool CreateDir(std::string& dirname);
    29. };

    🌳.stat接口

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

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

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

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

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

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

    🍎. 获取文件的大小

    1. size_t sjp::FileUtil::GetFileSize(){
    2. struct stat buf;
    3. if(stat(filename.c_str(),&buf)==-1){
    4. cout<<"GetFileSize fail.."<
    5. }
    6. return buf.st_size;
    7. }

    🍎.判断文件是否存在

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

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

    1. size_t sjp::FileUtil::GetFileAccessTime(){
    2. struct stat buf;
    3. if(stat(filename.c_str(),&buf)==-1){
    4. cout<<"GetFielAccessTime fail.."<
    5. }
    6. return buf.st_atime;
    7. }

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

    1. size_t sjp::FileUtil::GetFileModfityTime(){
    2. struct stat buf;
    3. if(stat(filename.c_str(),&buf)==-1){
    4. cout<<"GetFileSize fail.."<
    5. }
    6. return buf.st_mtime;
    7. }

    🌳.获取文件名

    功能:

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

    1. std::string sjp::FileUtil::GetFilename(){
    2. size_t pos=filename.rfind("/");
    3. if(pos==std::string::npos)
    4. {
    5. return filename;
    6. }
    7. return filename.substr(pos+1);
    8. }

    🌳.获取文件的内容

    功能:

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

    1. //获取文件的部分内容
    2. bool sjp::FileUtil::GetPosContent(size_t pos,size_t n,std::string& body){
    3. if(!Exist()){
    4. cout<<"GetPostContent: file is not exist"<
    5. return false;
    6. }
    7. if(GetFileSize()
    8. cout<<"GetFileSize fail:42"<
    9. return false;
    10. }
    11. //按照二进制流的方式打开文件
    12. std::ifstream ifs;
    13. ifs.open(filename,std::ios::binary);
    14. //将文件位置偏移到pos位置
    15. ifs.seekg(pos,std::ios::beg);
    16. body.resize(n);
    17. //获取到的数据放进body中
    18. ifs.read(&body[0],n);
    19. if(ifs.good()==false){
    20. std::cout<<"get file content failed\n"<
    21. return false;
    22. }
    23. ifs.close();
    24. return true;
    25. }
    26. //获取文件的所有的内容
    27. bool sjp::FileUtil::GetContent(std::string& body){
    28. size_t size=GetFileSize();
    29. return GetPosContent(0,size,body);
    30. }
    • ifstream对象能够将文件中的数据关联起来,并可以读取文件中的内容。
    • ifs.seekg(pos,std::ios::beg) :将文件从起始位置偏移到pos的位置

    🌳.往文件中写入内容

    功能:

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

    1. bool sjp::FileUtil::SetContent(std::string& body)
    2. {
    3. //打开文件将文件与ofs关联起来
    4. std::ofstream ofs;
    5. ofs.open(filename,std::ios::binary);
    6. //将body的数据写入文件中
    7. ofs.write(body.c_str(),body.size());
    8. if(ofs.good()==false)
    9. {
    10. cout<<"FileUtil.cpp 52 line:SetContent failing"<
    11. return false;
    12. }
    13. return true;
    14. }
    • ofstream对象能够与文件进行关联起来,并可以往文件中写入数据

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

    功能:

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

    1. #include
    2. namespace fs = std::experimental::filesystem;
    3. bool sjp::FileUtil::GetPathInDir(std::vector& arry)
    4. {
    5. for(auto & p:fs::directory_iterator(filename)){
    6. arry.push_back(p.path().relative_path());
    7. }
    8. return true;
    9. }
    • 获取目录下所有文件信息,需要使用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

    1. bool sjp::FileUtil::PackFile(const std::string& packname)
    2. {
    3. //将打开文件
    4. std::ifstream ifs;
    5. ifs.open(filename.c_str(),std::ios::binary);
    6. ifs.seekg(0,ifs.end);
    7. int size=ifs.tellg();
    8. ifs.seekg(0,ifs.beg);
    9. //将文件信息往提取到文件中
    10. std::string body;
    11. body.resize(size);
    12. ifs.read(&body[0],size);
    13. //压缩文件
    14. std::string packed=bundle::pack(bundle::LZIP,body);
    15. std::ofstream ofs;
    16. ofs.open(packname.c_str());
    17. ofs.write(&packed[0],packed.size());
    18. ofs.close();
    19. ifs.close();
    20. return true;
    21. }

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

    bundle文件压缩库的使用

    🌳.解压文件

    功能:

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

    1. bool sjp::FileUtil::UnpackFile(const std::string& unpackfile){
    2. std::ifstream ifs;
    3. ifs.open(filename.c_str(),std::ios::binary);
    4. ifs.seekg(0,ifs.end);
    5. int size=ifs.tellg();
    6. ifs.seekg(0,ifs.beg);
    7. std::string body;
    8. body.resize(size);
    9. ifs.read(&body[0],size);
    10. std::string unpacked=bundle::unpack(body);
    11. std::ofstream ofs;
    12. ofs.open(unpackfile.c_str(),std::ios::binary);
    13. ofs.write(unpacked.c_str(),unpacked.size());
    14. ifs.close();
    15. ofs.close();
    16. return true;
    17. }

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

    🌳.删除文件

    功能:

    删除FileUtil中的文件

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

    🚀.Json工具类

    Json工具类的设计需要使用到Jsoncpp接口,Jsoncpp接口和Json的详解在这篇文章有详细解析:
    【Json】——jsoncpp的序列化以及反序列化

    • Serialize将Json::Value对象root序列化 Json字符串body。
    • UnSerialize将Json字符串body反序列化为Json::Value对象root.
    1. class JsonUtil
    2. {
    3. public:
    4. //将root序列化为Json字符串
    5. static bool Serialize(Json::Value& root,std::string& body)
    6. {
    7. Json::StreamWriterBuilder swb;
    8. std::unique_ptr s(swb.newStreamWriter());
    9. std::stringstream ss;
    10. //将value对象转换为Json数据流
    11. s->write(root,&ss);
    12. body=ss.str();
    13. return true;
    14. }
    15. //将Json字符串反序列化为Json::Value
    16. static bool UnSerialize(Json::Value& root,std::string& body)
    17. {
    18. Json::CharReaderBuilder crb;
    19. std::unique_ptr cr(crb.newCharReader());
    20. std::string err;
    21. W> bool ret=cr->parse(body.c_str(),body.c_str()+body.size(),&root,&err);
    22. return true;
    23. }
    24. };

  • 相关阅读:
    通过对抽象模型和概念模型的整合,细化项目整体流程
    查找2个dom节点的最近的共同父元素
    C++多线程学习06
    DL之GRU(Tensorflow框架):基于茅台股票数据集利用GRU算法实现回归预测(保存模型.ckpt.index、.ckpt.data文件)
    私募基金CRM客户关系管理系统软件开发应该具备的功能清单
    全栈技术面试十问(中英双语)
    Unity关于无法新建项目的可能解决办法
    YB506A是一款锂电池充、放电管理专用芯片,集成锂电池充电管理和降压DCDC电路
    一、基本remix环境及HelloWord contract《2022 solidity8.+ 版本教程到实战》
    Nacos-server(1.4.4)安装部署-SpringCloudAlibaba微服务
  • 原文地址:https://blog.csdn.net/sjp11/article/details/128169780