1. 程式人生 > 其它 >C++檔案處理工具類

C++檔案處理工具類

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