diff options
Diffstat (limited to 'src/zenutil')
| -rw-r--r-- | src/zenutil/basicfile.cpp | 16 | ||||
| -rw-r--r-- | src/zenutil/include/zenutil/basicfile.h | 1 |
2 files changed, 17 insertions, 0 deletions
diff --git a/src/zenutil/basicfile.cpp b/src/zenutil/basicfile.cpp index 12d9cf950..84e8bed85 100644 --- a/src/zenutil/basicfile.cpp +++ b/src/zenutil/basicfile.cpp @@ -128,6 +128,22 @@ BasicFile::Open(const std::filesystem::path& FileName, Mode InMode, std::error_c } void +BasicFile::Open(const std::filesystem::path& FileName, Mode Mode, std::function<bool(std::error_code& Ec)>&& RetryCallback) +{ + std::error_code Ec; + Open(FileName, Mode, Ec); + while (Ec && RetryCallback(Ec)) + { + Ec.clear(); + Open(FileName, Mode, Ec); + } + if (Ec) + { + throw std::system_error(Ec, fmt::format("failed to open file '{}', mode: {:x}", FileName, uint32_t(Mode))); + } +} + +void BasicFile::Close() { if (m_FileHandle) diff --git a/src/zenutil/include/zenutil/basicfile.h b/src/zenutil/include/zenutil/basicfile.h index 5a27befd9..7cf8b05db 100644 --- a/src/zenutil/include/zenutil/basicfile.h +++ b/src/zenutil/include/zenutil/basicfile.h @@ -49,6 +49,7 @@ public: void Open(const std::filesystem::path& FileName, Mode Mode); void Open(const std::filesystem::path& FileName, Mode Mode, std::error_code& Ec); + void Open(const std::filesystem::path& FileName, Mode Mode, std::function<bool(std::error_code& Ec)>&& RetryCallback); void Close(); void Read(void* Data, uint64_t Size, uint64_t FileOffset); IoBuffer ReadRange(uint64_t FileOffset, uint64_t ByteCount); |