From fe068c76e0f38dabf80bff2730ff9c713763d707 Mon Sep 17 00:00:00 2001 From: Stefan Boberg Date: Sun, 19 Sep 2021 23:17:44 +0200 Subject: Added BasicFile::StreamFile helper function to support reading large files in a chunked fashion (will be using memory-mapped strategy in the future where it makes sense) --- zenstore/basicfile.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'zenstore/basicfile.cpp') diff --git a/zenstore/basicfile.cpp b/zenstore/basicfile.cpp index 75de638cf..126f2a8b3 100644 --- a/zenstore/basicfile.cpp +++ b/zenstore/basicfile.cpp @@ -95,6 +95,29 @@ BasicFile::ReadAll() return Buffer; } +void +BasicFile::StreamFile(std::function&& 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) { -- cgit v1.2.3