aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--zenstore/basicfile.cpp23
-rw-r--r--zenstore/include/zenstore/basicfile.h6
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; }