diff options
| author | Hein-Pieter van Braam | 2018-02-24 17:34:10 +0100 |
|---|---|---|
| committer | Hein-Pieter van Braam | 2018-02-24 17:37:07 +0100 |
| commit | d69d58deeaa523c6c38958b3956423ae8f814909 (patch) | |
| tree | 0aa9bd41b7724dd35ff745882aa8a9465fa5f1f9 /drivers | |
| parent | 34591f94515f3ced1448686b729c2ed8cccebd1d (diff) | |
| download | godot-d69d58deeaa523c6c38958b3956423ae8f814909.tar.gz godot-d69d58deeaa523c6c38958b3956423ae8f814909.tar.zst godot-d69d58deeaa523c6c38958b3956423ae8f814909.zip | |
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/windows/dir_access_windows.cpp | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/drivers/windows/dir_access_windows.cpp b/drivers/windows/dir_access_windows.cpp index 2e64b5543..cf4d82fb0 100644 --- a/drivers/windows/dir_access_windows.cpp +++ b/drivers/windows/dir_access_windows.cpp @@ -261,13 +261,30 @@ Error DirAccessWindows::rename(String p_path, String p_new_path) { p_new_path = fix_path(p_new_path); - if (file_exists(p_new_path)) { - if (remove(p_new_path) != OK) { + // If we're only changing file name case we need to do a little juggling + if (p_path.to_lower() == p_new_path.to_lower()) { + WCHAR tmpfile[MAX_PATH]; + + if (!GetTempFileNameW(fix_path(get_current_dir()).c_str(), NULL, 0, tmpfile)) { return FAILED; - }; - }; + } + + if (!::ReplaceFileW(tmpfile, p_path.c_str(), NULL, 0, NULL, NULL)) { + DeleteFileW(tmpfile); + return FAILED; + } - return ::_wrename(p_path.c_str(), p_new_path.c_str()) == 0 ? OK : FAILED; + return ::_wrename(tmpfile, p_new_path.c_str()) == 0 ? OK : FAILED; + + } else { + if (file_exists(p_new_path)) { + if (remove(p_new_path) != OK) { + return FAILED; + } + } + + return ::_wrename(p_path.c_str(), p_new_path.c_str()) == 0 ? OK : FAILED; + } } Error DirAccessWindows::remove(String p_path) { |
