diff options
| -rw-r--r-- | zenstore/basicfile.cpp | 23 | ||||
| -rw-r--r-- | zenstore/include/zenstore/basicfile.h | 6 |
2 files changed, 27 insertions, 2 deletions
diff --git a/zenstore/basicfile.cpp b/zenstore/basicfile.cpp index 75de638cf..126f2a8b3 100644 --- a/zenstore/basicfile.cpp +++ b/zenstore/basicfile.cpp @@ -96,6 +96,29 @@ BasicFile::ReadAll() } void +BasicFile::StreamFile(std::function<void(const void* Data, uint64_t Size)>&& ChunkFun) +{ + const uint64_t ChunkSize = 128 * 1024; + IoBuffer ReadBuffer{ChunkSize}; + void* BufferPtr = ReadBuffer.MutableData(); + + uint64_t RemainBytes = FileSize(); + uint64_t CurrentOffset = 0; + + while (RemainBytes) + { + const uint64_t ThisChunkBytes = zen::Min(ChunkSize, RemainBytes); + + Read(BufferPtr, ThisChunkBytes, CurrentOffset); + + ChunkFun(BufferPtr, ThisChunkBytes); + + CurrentOffset += ThisChunkBytes; + RemainBytes -= ThisChunkBytes; + } +} + +void BasicFile::Write(const void* Data, uint64_t Size, uint64_t Offset) { OVERLAPPED Ovl{}; diff --git a/zenstore/include/zenstore/basicfile.h b/zenstore/include/zenstore/basicfile.h index 0daa5d39f..a5874cfe4 100644 --- a/zenstore/include/zenstore/basicfile.h +++ b/zenstore/include/zenstore/basicfile.h @@ -8,6 +8,7 @@ #include <zencore/windows.h> #include <filesystem> +#include <functional> namespace zen { @@ -28,8 +29,9 @@ public: void Open(std::filesystem::path FileName, bool IsCreate); void Open(std::filesystem::path FileName, bool IsCreate, std::error_code& Ec); void Close(); - void Read(void* Data, uint64_t Size, uint64_t Offset); - void Write(const void* Data, uint64_t Size, uint64_t Offset); + void Read(void* Data, uint64_t Size, uint64_t FileOffset); + void StreamFile(std::function<void(const void* Data, uint64_t Size)>&& ChunkFun); + void Write(const void* Data, uint64_t Size, uint64_t FileOffset); void Flush(); uint64_t FileSize(); void* Handle() { return m_FileHandle; } |