aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-08-28 21:03:50 +0200
committerStefan Boberg <[email protected]>2021-08-28 21:03:50 +0200
commit5acd66ed9488664b2f1aaa238a3b982b06f4d115 (patch)
tree43c928ddda0ef7480a29612906cb005ba3fa1fbc
parenttrivial: Simple comment edit (diff)
downloadzen-5acd66ed9488664b2f1aaa238a3b982b06f4d115.tar.xz
zen-5acd66ed9488664b2f1aaa238a3b982b06f4d115.zip
Added WriteFile() overload which accepts a single IoBuffer
-rw-r--r--zencore/filesystem.cpp22
-rw-r--r--zencore/include/zencore/filesystem.h3
2 files changed, 20 insertions, 5 deletions
diff --git a/zencore/filesystem.cpp b/zencore/filesystem.cpp
index 908810773..591630b75 100644
--- a/zencore/filesystem.cpp
+++ b/zencore/filesystem.cpp
@@ -400,19 +400,26 @@ CopyFile(std::filesystem::path FromPath, std::filesystem::path ToPath, const Cop
return Success;
}
-bool
+void
WriteFile(std::filesystem::path Path, const IoBuffer* const* Data, size_t BufferCount)
{
using namespace fmt::literals;
CAtlFile Outfile;
HRESULT hRes = Outfile.Create(Path.c_str(), GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS);
+ if (hRes == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND))
+ {
+ zen::CreateDirectories(Path.parent_path());
+
+ hRes = Outfile.Create(Path.c_str(), GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS);
+ }
+
if (FAILED(hRes))
{
zen::ThrowSystemException(hRes, "File open failed for '{}'"_format(Path).c_str());
}
- // TODO: this could be block-enlightened
+ // TODO: this should be block-enlightened
for (size_t i = 0; i < BufferCount; ++i)
{
@@ -421,7 +428,7 @@ WriteFile(std::filesystem::path Path, const IoBuffer* const* Data, size_t Buffer
while (WriteSize)
{
- uint64_t ChunkSize = zen::Min<uint64_t>(WriteSize, uint64_t(2) * 1024 * 1024 * 1024);
+ const uint64_t ChunkSize = zen::Min<uint64_t>(WriteSize, uint64_t(2) * 1024 * 1024 * 1024);
hRes = Outfile.Write(DataPtr, gsl::narrow_cast<uint32_t>(WriteSize));
@@ -434,10 +441,17 @@ WriteFile(std::filesystem::path Path, const IoBuffer* const* Data, size_t Buffer
DataPtr = reinterpret_cast<const uint8_t*>(DataPtr) + ChunkSize;
}
}
+}
- return true;
+void
+WriteFile(std::filesystem::path Path, IoBuffer Data)
+{
+ const IoBuffer* const DataPtr = &Data;
+
+ WriteFile(Path, &DataPtr, 1);
}
+
FileContents
ReadFile(std::filesystem::path Path)
{
diff --git a/zencore/include/zencore/filesystem.h b/zencore/include/zencore/filesystem.h
index d8140932b..a2d368d6f 100644
--- a/zencore/include/zencore/filesystem.h
+++ b/zencore/include/zencore/filesystem.h
@@ -43,7 +43,8 @@ struct FileContents
ZENCORE_API FileContents ReadFile(std::filesystem::path Path);
ZENCORE_API bool ScanFile(std::filesystem::path Path, uint64_t ChunkSize, std::function<void(const void* Data, size_t Size)>&& ProcessFunc);
-ZENCORE_API bool WriteFile(std::filesystem::path Path, const IoBuffer* const* Data, size_t BufferCount);
+ZENCORE_API void WriteFile(std::filesystem::path Path, const IoBuffer* const* Data, size_t BufferCount);
+ZENCORE_API void WriteFile(std::filesystem::path Path, IoBuffer Data);
struct CopyFileOptions
{