#ifndef EZ_SPLIT_FILE_H #define EZ_SPLIT_FILE_H #include #include #include #include #include enum FileBlockStatus { BLOCK_STATUS_NOT_EXISTS, BLOCK_STATUS_CREATED, BLOCK_STATUS_DELETED }; typedef struct { std::string block_file; size_t size; FILE* fd; bool is_last; FileBlockStatus status; } FileBlock; class SplitFile { public: SplitFile(const std::string& path, size_t block_size); ~SplitFile(); size_t Read(char* buf, size_t buf_size, size_t offset); ssize_t Write(char* buf, size_t buf_size); int Open(); int Close(); bool IsClosed(); private: std::vector file_blocks; size_t write_offset = 0; size_t block_size; size_t read_offset; std::string path; int write_error; bool complete; FileBlock *block_in_progress; sem_t block_ready; FileBlock *NewBlock(); }; #endif