当前位置: 首页 > news >正文

文件操作助手

文件操作助手

在我们实现一个大型项目时,往往会有一个公共模块,这个公共模块是公用的,里面可能会包含文件操作助手、字符串操作助手、时间戳操作助手…

而我们今天就来实现一个文件操作助手,里面包含的功能有:

  • 判断文件是否存在
  • 获取文件大小
  • 读文件
  • 写文件
  • 重命名
  • 创建文件
  • 删除文件
  • 创建文件夹
  • 删除文件夹
class FileHelper
{
    public:
    FileHelper(const std::string& filename)
        :_filename(filename)
        {}
    bool exists()
    {
        struct stat st;
        return (stat(_filename.c_str(),&st) == 0);
    }
    size_t size()
    {
        struct stat st;
        int ret = stat(_filename.c_str(),&st);
        if(ret < 0)
            return ret;
        return st.st_size;
    }

    bool read(char* body,size_t offset,size_t len)
    {
        //打开文件
        std::ifstream in(_filename,std::ios::binary | std::ios::in);
        if(!in.is_open())
        {
            ELOG("%s 打开文件失败!",_filename.c_str());
            return false;
        }
        //跳转到读取位置
        in.seekg(offset,std::ios::beg);
        //读取数据
        in.read(body,len);
        if(in.good() == false)
        {
            ELOG("%s 读取文件失败!",_filename.c_str());
            in.close();
            return false;
        }
        in.close();
        return true;
        //关闭文件
    }

    bool read(std::string& body)
    {
        size_t fsize = this->size();
        body.resize(fsize);
        return read(&body[0],0,fsize);
    }
    bool write(const char *body,size_t offset,size_t len)
    {
        //打开文件
        std::fstream fs(_filename,std::ios::binary | std::ios::in | std::ios::out);
        if(!fs.is_open())
        {
            ELOG("%s 打开文件失败!",_filename.c_str());
            return false;
        }
        //跳转到读取位置
        fs.seekp(offset,std::ios::beg);
        //读取数据
        fs.write(body,len);
        if(fs.good() == false)
        {
            ELOG("%s 读取文件失败!",_filename.c_str());
            fs.close();
            return false;
        } 
        fs.close();
        return true;
        //关闭文件
    }

    bool write(const std::string& body)
    {
        return write(body.c_str(),0,body.size());
    }
    static std::string parentDirectory(const std::string& filename)
    {
        size_t pos = filename.find_last_of('/');
        if(pos == std::string::npos)
            return ".";
        return filename.substr(0,pos);
    }
    bool rename(const std::string& newname)
    {
        return (::rename(_filename.c_str(),newname.c_str()) == 0);
    }
    static bool createFile(const std::string &filename) {
        std::fstream ofs(filename, std::ios::binary | std::ios::out); 
        if (ofs.is_open() == false) {
            ELOG("%s 文件打开失败!", filename.c_str());
            return false;
        }
        ofs.close();
        return true;
    }
    static bool removeFile(const std::string &filename) {
        return (::remove(filename.c_str()) == 0);
    }
    static bool createDirectory(const std::string &path) {
        //  aaa/bbb/ccc    cccc
        // 在多级路径创建中,我们需要从第一个父级目录开始创建
        size_t pos, idx = 0;
        while(idx < path.size()) {
            pos = path.find("/", idx);
            if (pos == std::string::npos) {
                return (mkdir(path.c_str(), 0775) == 0);
            }
            std::string subpath = path.substr(0, pos);
            int ret = mkdir(subpath.c_str(), 0775);
            if (ret != 0 && errno != EEXIST) {
                ELOG("创建目录 %s 失败: %s", subpath.c_str(), strerror(errno));
                return false;
            }
            idx = pos + 1;
        }
        return true;
    }
    static bool removeDirectory(const std::string &path) {
        // rm -rf path
        // system()
        std::string cmd = "rm -rf " + path;
        return (system(cmd.c_str()) != -1);
    }
    private:
    std::string _filename;
};

相关文章:

  • 2025年渗透测试面试题总结-某360-企业蓝军面试复盘 (题目+回答)
  • 网站备份 工具,如何使用网站备份工具进行网站备份
  • MSIL入门
  • 测试用例`
  • 【橘子网络】关于网络分层以及协议的全局讲解
  • 小智物联网开发:为小智安装“机械臂“(其实就是加个舵机进行语音控制)
  • win32汇编环境,网络编程入门之九
  • 2025年了,5G还有三个新变化
  • unityAB包(2/2)
  • 性能测试笔记
  • asp.net进销存软件WEB进销存ERP软件库存玻璃行业
  • MySQL 5.7升级8.0报异常:处理新增关键字
  • [ACTF2020 新生赛]BackupFile-3.23BUUCTF练习day5(1)
  • 【北京大学】DeepSeek内部研讨系列:DeepSeek原理和落地应用
  • Linux shell脚本3-if语句、case语句、for语句、while语句、until语句、break语句、continue语句,格式说明及程序验证
  • 使用Ollama(自定义安装位置)与RagFlow构建本地知识库
  • 跟着StatQuest学知识07-张量与PyTorch
  • 【leetcode hot 100 34】在排序数组中查找元素的第一个和最后一个位置
  • LLM-01-第一章-预训练/神经网络的激活函数(一)概述
  • 信息安全和病毒防护——非对称加密和对称加密
  • 跳水世界杯女子单人10米台决赛,陈芋汐、全红婵包揽金银牌
  • 塞尔维亚总统因突发健康问题,中断对美国的正式访问并回国
  • 抗战回望15︱《五月国耻纪念专号》:“不堪回首”
  • 王毅在金砖正式成员和伙伴国外长会上的发言
  • 印巴局势紧张或爆发军事冲突,印度空军能“一雪前耻”吗?
  • 微软上财季净利增长18%:云业务增速环比提高,业绩指引高于预期