C++文件处理工具类,hpp文件,使用时只需要include即可,跨平台

File.hpp

#ifndef FILE_HPP
#define FILE_HPP #include <fstream>
#include <string>
#include <stdexcept>
#include <memory>
#include <sstream>
#include <unistd.h> #include<sys/stat.h> namespace sh
{
enum class FileMode
{
EXISTS = 0,//存在
EXECUTE = 1,//执行
WRITE = 2,//写
READ = 4//读
}; /**
* 文件操作
* @author: sherlock_lht
*/
class BaseFileIO
{ protected: std::fstream fileStream;
std::string fileName; explicit BaseFileIO(const std::string &fileName)
{
this->fileName = fileName;
}
public:
/**
* 检查文件是否存在
*/
static bool exists(const std::string &filePath)
{
return access(filePath.c_str(), F_OK) == 0;
} /**
* 检查指定文件的指定属性,包括是否存在、是否可读、是否可写、是否有权限执行
*/
static bool checkFileMode(const std::string& filePath, sh::FileMode mode)
{
return access(filePath.c_str(), (int)mode) == 0;
} /**
* 给指定文件赋予权限,同chmod指令
*/
static bool chmodFile(const std::string &filePath, int mode)
{
return chmod(filePath.c_str(), mode) == 0;
} public:
/**
* 打开文件,返回是否成功打开
*/
bool open(std::ios_base::openmode mode)
{
if (fileStream.is_open())
{
close();
}
fileStream.open(fileName, mode);
return fileStream.is_open();
} /**
* 设置文件的开始读取偏移
*/
void seekInputPosition(std::size_t offsetPosition, std::ios_base::seekdir position = std::ios::beg)
{
fileStream.seekg(offsetPosition, position);
} /**
* 是否已经读到end,可用此方法判断文件是否已经读完
*/
bool endOfFile() const
{
return fileStream.eof();
} /**
* 获取当前处理的文件名称
*/
std::string getFileName() const
{
return fileName;
} /**
* 关闭文件流,如果从未打开,则无任何操作
*/
void close()
{
if (fileStream.is_open())
{
fileStream.close();
}
} virtual ~BaseFileIO()
{
close();
}
}; class File: public BaseFileIO
{
public:
/**
* 向指定的文件写入指定的内容,返回值表示是否写入成功
*/
static bool saveTextTo(const std::string &fileName, const std::string &text)
{
File fileToWrite(fileName);
if (fileToWrite.open(std::ios::out | std::ios::app))
{
fileToWrite.write(text);
fileToWrite.close();
return true;
}
return false;
}
public: explicit File(const std::string &fileName)
: BaseFileIO(fileName)
{} /**
* 写入内容,返回值表示写入成功的长度
*/
std::size_t write(const std::string &content)
{
auto before = fileStream.tellp();
fileStream.write(content.data(), content.length());
return fileStream.tellp() - before;
} /**
* 读取所有文件内容
* offset参数表示开始读取的偏移
* 如果在调用之前有读取过文件,则会影响该函数的开始读取位置
*/
std::string readAll(std::size_t offset = 0)
{
if (!fileStream.is_open())
{
return "";
}
if (offset > 0)
{
seekInputPosition(offset);
}
std::stringstream buf;
buf << fileStream.rdbuf();
return buf.str();
} /**
* 读取指定数量的字符串,如果内容不够,则读完
* offset参数表示开始读取的偏移
* 读取位置置于本次最后读取的内容的结尾
*/
std::string read(std::size_t maxSize, std::size_t offset = 0)
{
if (!fileStream.is_open())
{
return "";
}
if (offset > 0)
{
seekInputPosition(offset);
}
std::unique_ptr<char[]> buf(new(std::nothrow) char[maxSize + 1]);
fileStream.read(buf.get(), maxSize);
std::size_t size = fileStream.gcount();
std::string str(buf.get(), size);
return str;
} /**
* 从标记开始位置读取到一行结尾,包括终止符
* offset参数表示开始读取的偏移
*/
std::string readLine(std::size_t maxSize, std::size_t offset = 0)
{
if (!fileStream.is_open())
{
return "";
} std::unique_ptr<char[]> buf(new(std::nothrow) char[maxSize + 1]);
fileStream.getline(buf.get(), maxSize);
std::size_t size = fileStream.gcount();
std::string str(buf.get(), size);
return str;
}
};
} #endif //FILE_HPP

C++文件处理工具类的更多相关文章

  1. 文件类型工具类:FileTypeUtil

    个人学习,仅供参考! package com.example.administrator.filemanager.utils;import java.io.File;/** * 文件类型工具类 * * ...

  2. iOS开发拓展篇—封装音频文件播放工具类

    iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...

  3. 文件夹工具类 - FolderUtils

    文件夹工具类,提供创建完整路径的方法. 源码如下:(点击下载 -FolderUtils.java .commons-io-2.4.jar ) import java.io.File; import o ...

  4. java文件处理工具类

    import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedRead ...

  5. 写文件的工具类,输出有格式的文件(txt、json/csv)

    import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io. ...

  6. properties文件读写工具类

    java代码: import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; ...

  7. Java-Properties文件读取工具类

    import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configurat ...

  8. Java 文件切割工具类

    Story: 发送MongoDB 管理软件到公司邮箱,工作使用. 1.由于公司邮箱限制附件大小,大文件无法发送,故做此程序用于切割大文件成多个小文件,然后逐个发送. 2.收到小文件之后,再重新组合成原 ...

  9. Java 压缩文件夹工具类(包含解压)

    依赖jar <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons ...

  10. ZIP解压缩文件的工具类【支持多级文件夹|全】

    ZIP解压缩文件的工具类[支持多级文件夹|全] 作者:Vashon 网上有非常多的加压缩演示样例代码.可是都仅仅是支持一级文件夹的操作.假设存在多级文件夹的话就不行了. 本解压缩工具类经过多次检查及重 ...

随机推荐

  1. Codeforces Round #664 题解(A ~ C)

    1395A - Boboniu Likes to Color Balls 如果在r,b,g,w中小于或等于一个奇数,则可以将其定为回文. 否则,请进行一次操作(如果可以),然后检查上述情况. 进行多次 ...

  2. 【Vue CLI】手把手教你撸插件

    本文首发于 vivo互联网技术 微信公众号链接:https://mp.weixin.qq.com/s/Rl8XLUX7isjXNUmbw0-wow作者:ZhuPing 现如今 Vue 作为主流的前端框 ...

  3. vue后台管理系统,接口环境配置

    https://coding.imooc.com/lesson/397.html#mid=31487

  4. zzuli 1902: 985的因子对难题

    ***这道题明显是在卡时间,类比快速打素数表的算法,*** #include<iostream> #include<cstdio> #include<cstring> ...

  5. sql语句内变量的使用

    0.原始表格如下: 1.定义变量,并在sql语句内查询: set @user_name = "成龙";SELECT * FROM `tb_user` where userName ...

  6. /etc/profile,/etc/bashrc,~/.profile,~/.bashrc 的区别及使用

    转载请注明出处: /etc/profile  为系统的全局环境变量设置,此文件为系统的每个用户设置环境信息    /etc/bashrc 为每一个运行bash shell的用户执行此文件.当bash ...

  7. centos7 systemctl配置开机自启动服务

    centos7使用systemctl替代原来/etc/init.d,按官方的说法是提高系统服务的运行效率.服务配置更加简单易用,对于一些自定义的服务来配置开机自启动,是真的香! 概念理解 它是服务管理 ...

  8. spring-transaction源码分析(1)概述和事务传播级别

    spring-tx概述 spring-tx包使用注解驱动和AOP通知将事务开启.提交/回滚.以及复杂的传播机制封装了起来,开发者不再需要编写事务管理的代码,而是可以只关注自己的业务逻辑. 本文将简单介 ...

  9. Manjaro Linux永久修改主机名

    技术背景 Linux系统中默认的主机名可以通过hostname指令进行查询,一般默认的是一串的随机字符串: [dechin@dechin-20n2s01200 numba]$ hostname dec ...

  10. [IDEA] - 左侧目录结构没了,怎么处理

    把项目目录下的.idea删除,再重启IDEA打开项目就行了