diff options
Diffstat (limited to 'src/zenremotestore/filesystemutils.cpp')
| -rw-r--r-- | src/zenremotestore/filesystemutils.cpp | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/src/zenremotestore/filesystemutils.cpp b/src/zenremotestore/filesystemutils.cpp index 20ab3faea..8dff05c6b 100644 --- a/src/zenremotestore/filesystemutils.cpp +++ b/src/zenremotestore/filesystemutils.cpp @@ -1,6 +1,6 @@ // Copyright Epic Games, Inc. All Rights Reserved. -#include "filesystemutils.h" +#include <zenremotestore/filesystemutils.h> #include <zenremotestore/chunking/chunkedcontent.h> @@ -215,11 +215,11 @@ SetFileReadOnlyWithRetry(const std::filesystem::path& Path, bool ReadOnly) bool Result = SetFileReadOnly(Path, ReadOnly, Ec); for (size_t Retries = 0; Ec && Retries < 3; Retries++) { - Sleep(100 + int(Retries * 50)); if (!IsFileWithRetry(Path)) { return false; } + Sleep(100 + int(Retries * 50)); Ec.clear(); Result = SetFileReadOnly(Path, ReadOnly, Ec); } @@ -277,11 +277,11 @@ RemoveFileWithRetry(const std::filesystem::path& Path) RemoveFile(Path, Ec); for (size_t Retries = 0; Ec && Retries < 6; Retries++) { - Sleep(100 + int(Retries * 50)); if (!IsFileWithRetry(Path)) { return; } + Sleep(100 + int(Retries * 50)); Ec.clear(); RemoveFile(Path, Ec); } @@ -426,12 +426,13 @@ CleanDirectory( (void)SetFileReadOnly(FilePath, false, Ec); for (size_t Retries = 0; Ec && Retries < 3; Retries++) { - Sleep(100 + int(Retries * 50)); if (!IsFileWithRetry(FilePath)) { IsRemoved = true; + Ec.clear(); break; } + Sleep(100 + int(Retries * 50)); Ec.clear(); (void)SetFileReadOnly(FilePath, false, Ec); } @@ -440,12 +441,13 @@ CleanDirectory( (void)RemoveFile(FilePath, Ec); for (size_t Retries = 0; Ec && Retries < 6; Retries++) { - Sleep(100 + int(Retries * 50)); if (!IsFileWithRetry(FilePath)) { IsRemoved = true; + Ec.clear(); return; } + Sleep(100 + int(Retries * 50)); Ec.clear(); (void)RemoveFile(FilePath, Ec); } @@ -542,25 +544,27 @@ CleanDirectory( { std::error_code Ec; - zen::CleanDirectory(DirectoryToDelete, true, Ec); + zen::CleanDirectory(DirectoryToDelete, /*ForceRemoveReadOnlyFiles*/ true, Ec); if (Ec) { Sleep(200); - zen::CleanDirectory(DirectoryToDelete, true, Ec); + Ec.clear(); + zen::CleanDirectory(DirectoryToDelete, /*ForceRemoveReadOnlyFiles*/ true, Ec); } if (!Ec) { - RemoveDir(Path, Ec); + RemoveDir(DirectoryToDelete, Ec); for (size_t Retries = 0; Ec && Retries < 3; Retries++) { - Sleep(100 + int(Retries * 50)); - if (!IsDir(Path)) + if (!IsDir(DirectoryToDelete)) { + Ec.clear(); break; } + Sleep(100 + int(Retries * 50)); Ec.clear(); - RemoveDir(Path, Ec); + RemoveDir(DirectoryToDelete, Ec); } } if (Ec) @@ -592,4 +596,33 @@ CleanDirectory( return Result; } +bool +CleanAndRemoveDirectory(WorkerThreadPool& WorkerPool, + std::atomic<bool>& AbortFlag, + std::atomic<bool>& PauseFlag, + const std::filesystem::path& Directory) +{ + if (!IsDir(Directory)) + { + return true; + } + if (CleanDirectoryResult Res = CleanDirectory( + WorkerPool, + AbortFlag, + PauseFlag, + Directory, + {}, + [](const std::string_view Details, uint64_t TotalCount, uint64_t RemainingCount, bool IsPaused, bool IsAborted) { + ZEN_UNUSED(Details, TotalCount, RemainingCount, IsPaused, IsAborted); + }, + 1000); + Res.FailedRemovePaths.empty()) + { + std::error_code Ec; + RemoveDir(Directory, Ec); + return !Ec; + } + return false; +} + } // namespace zen |