C++檔案處理工具類
阿新 • • 發佈:2021-08-06
C++檔案處理工具類,hpp檔案,使用時只需要include即可,跨平臺
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