// Copyright Epic Games, Inc. All Rights Reserved. #include "zenstore/basicfile.h" #include #include #include #include #include namespace zen { using namespace fmt::literals; void BasicFile::Open(std::filesystem::path FileName, bool isCreate) { const DWORD dwCreationDisposition = isCreate ? CREATE_ALWAYS : OPEN_EXISTING; HRESULT hRes = m_File.Create(FileName.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, dwCreationDisposition); if (FAILED(hRes)) { ThrowSystemException(hRes, "Failed to open bucket sobs file '{}'"_format(FileName)); } } void BasicFile::Read(void* Data, uint64_t Size, uint64_t Offset) { OVERLAPPED Ovl{}; Ovl.Offset = DWORD(Offset & 0xffff'ffffu); Ovl.OffsetHigh = DWORD(Offset >> 32); HRESULT hRes = m_File.Read(Data, gsl::narrow(Size), &Ovl); if (FAILED(hRes)) { ThrowSystemException(hRes, "Failed to read from file '{}'"_format(zen::PathFromHandle(m_File))); } } IoBuffer BasicFile::ReadAll() { IoBuffer Buffer(FileSize()); Read((void*)Buffer.Data(), Buffer.Size(), 0); return Buffer; } void BasicFile::Write(const void* Data, uint64_t Size, uint64_t Offset) { OVERLAPPED Ovl{}; Ovl.Offset = DWORD(Offset & 0xffff'ffffu); Ovl.OffsetHigh = DWORD(Offset >> 32); HRESULT hRes = m_File.Write(Data, gsl::narrow(Size), &Ovl); if (FAILED(hRes)) { ThrowSystemException(hRes, "Failed to write to file '{}'"_format(zen::PathFromHandle(m_File))); } } void BasicFile::Flush() { m_File.Flush(); } uint64_t BasicFile::FileSize() { ULONGLONG Sz; m_File.GetSize(Sz); return uint64_t(Sz); } void BasicFile::Close() { m_File.Close(); } } // namespace zen