C++文件处理工具类
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++文件处理工具类的更多相关文章
- 文件类型工具类:FileTypeUtil
个人学习,仅供参考! package com.example.administrator.filemanager.utils;import java.io.File;/** * 文件类型工具类 * * ...
- iOS开发拓展篇—封装音频文件播放工具类
iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...
- 文件夹工具类 - FolderUtils
文件夹工具类,提供创建完整路径的方法. 源码如下:(点击下载 -FolderUtils.java .commons-io-2.4.jar ) import java.io.File; import o ...
- java文件处理工具类
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedRead ...
- 写文件的工具类,输出有格式的文件(txt、json/csv)
import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io. ...
- properties文件读写工具类
java代码: import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; ...
- Java-Properties文件读取工具类
import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configurat ...
- Java 文件切割工具类
Story: 发送MongoDB 管理软件到公司邮箱,工作使用. 1.由于公司邮箱限制附件大小,大文件无法发送,故做此程序用于切割大文件成多个小文件,然后逐个发送. 2.收到小文件之后,再重新组合成原 ...
- Java 压缩文件夹工具类(包含解压)
依赖jar <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons ...
- ZIP解压缩文件的工具类【支持多级文件夹|全】
ZIP解压缩文件的工具类[支持多级文件夹|全] 作者:Vashon 网上有非常多的加压缩演示样例代码.可是都仅仅是支持一级文件夹的操作.假设存在多级文件夹的话就不行了. 本解压缩工具类经过多次检查及重 ...
随机推荐
- Codeforces Round #664 题解(A ~ C)
1395A - Boboniu Likes to Color Balls 如果在r,b,g,w中小于或等于一个奇数,则可以将其定为回文. 否则,请进行一次操作(如果可以),然后检查上述情况. 进行多次 ...
- 【Vue CLI】手把手教你撸插件
本文首发于 vivo互联网技术 微信公众号链接:https://mp.weixin.qq.com/s/Rl8XLUX7isjXNUmbw0-wow作者:ZhuPing 现如今 Vue 作为主流的前端框 ...
- vue后台管理系统,接口环境配置
https://coding.imooc.com/lesson/397.html#mid=31487
- zzuli 1902: 985的因子对难题
***这道题明显是在卡时间,类比快速打素数表的算法,*** #include<iostream> #include<cstdio> #include<cstring> ...
- sql语句内变量的使用
0.原始表格如下: 1.定义变量,并在sql语句内查询: set @user_name = "成龙";SELECT * FROM `tb_user` where userName ...
- /etc/profile,/etc/bashrc,~/.profile,~/.bashrc 的区别及使用
转载请注明出处: /etc/profile 为系统的全局环境变量设置,此文件为系统的每个用户设置环境信息 /etc/bashrc 为每一个运行bash shell的用户执行此文件.当bash ...
- centos7 systemctl配置开机自启动服务
centos7使用systemctl替代原来/etc/init.d,按官方的说法是提高系统服务的运行效率.服务配置更加简单易用,对于一些自定义的服务来配置开机自启动,是真的香! 概念理解 它是服务管理 ...
- spring-transaction源码分析(1)概述和事务传播级别
spring-tx概述 spring-tx包使用注解驱动和AOP通知将事务开启.提交/回滚.以及复杂的传播机制封装了起来,开发者不再需要编写事务管理的代码,而是可以只关注自己的业务逻辑. 本文将简单介 ...
- Manjaro Linux永久修改主机名
技术背景 Linux系统中默认的主机名可以通过hostname指令进行查询,一般默认的是一串的随机字符串: [dechin@dechin-20n2s01200 numba]$ hostname dec ...
- [IDEA] - 左侧目录结构没了,怎么处理
把项目目录下的.idea删除,再重启IDEA打开项目就行了