Skip to content

Commit 3bfe940

Browse files
committed
On Windows use RemoveDirectoryW to delete empty directory before renaming directory to it
I don't know why but using `llvm::sys::fs::remove_directories` to delete the directories sometimes does not actually delete the directory, which causes `MoveFileW` to fail because the destination already exists. I don't see this issue when using `RemoveDirectoryW`
1 parent b093cdb commit 3bfe940

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

lib/Database/Database.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,6 @@ static std::error_code renameDirectory(const Twine &from, const Twine &to) {
5555
if (!llvm::sys::fs::exists(from)) {
5656
return make_error_code(llvm::errc::no_such_file_or_directory);
5757
}
58-
// MoveFileW does not override an existing directory. Remove the destination if it exists.
59-
llvm::sys::fs::remove_directories(to, /*IgnoreErrors=*/true);
6058
SmallVector<wchar_t, 128> wideFrom;
6159
if (std::error_code ec = llvm::sys::path::widenPath(from, wideFrom)) {
6260
return ec;
@@ -65,6 +63,8 @@ static std::error_code renameDirectory(const Twine &from, const Twine &to) {
6563
if (std::error_code ec = llvm::sys::path::widenPath(to, wideTo)) {
6664
return ec;
6765
}
66+
// MoveFileW does not override an existing directory. Remove the destination if it is an empty directory.
67+
::RemoveDirectoryW(wideTo.begin());
6868
if (!::MoveFileW(wideFrom.begin(), wideTo.begin())) {
6969
return llvm::mapWindowsError(GetLastError());
7070
}

0 commit comments

Comments
 (0)