summaryrefslogtreecommitdiff
path: root/drivers/windows
diff options
context:
space:
mode:
authorAnton Yabchinskiy <arn@bestmx.ru>2015-03-10 11:44:40 +0300
committerAnton Yabchinskiy <arn@bestmx.ru>2015-03-10 11:44:40 +0300
commit43713810deaadfec6a1656767cf5520073e58a06 (patch)
tree8b1c7e82562494e1889b1550b58b3d953f076696 /drivers/windows
parent19a99afa81354ed69e1c07b6050aeb438e4ee2cb (diff)
parent91744e9ed3124ca48e0837ee72bfe7182fd31701 (diff)
Merge branch 'master' of https://github.com/okamstudio/godot
Diffstat (limited to 'drivers/windows')
-rw-r--r--drivers/windows/file_access_windows.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/windows/file_access_windows.cpp b/drivers/windows/file_access_windows.cpp
index a6073cbb29..e24685432c 100644
--- a/drivers/windows/file_access_windows.cpp
+++ b/drivers/windows/file_access_windows.cpp
@@ -28,14 +28,18 @@
/*************************************************************************/
#ifdef WINDOWS_ENABLED
+#include <Windows.h>
+#include "Shlwapi.h"
#include "file_access_windows.h"
+
#include <sys/types.h>
#include <sys/stat.h>
#include <wchar.h>
#include <tchar.h>
#include "print_string.h"
+
#ifdef _MSC_VER
#define S_ISREG(m) ((m)&_S_IFREG)
#endif
@@ -111,10 +115,20 @@ void FileAccessWindows::close() {
//unlink(save_path.utf8().get_data());
//print_line("renaming..");
- _wunlink(save_path.c_str()); //unlink if exists
- int rename_error = _wrename((save_path+".tmp").c_str(),save_path.c_str());
+ //_wunlink(save_path.c_str()); //unlink if exists
+ //int rename_error = _wrename((save_path+".tmp").c_str(),save_path.c_str());
+
+
+ bool rename_error;
+ if (!PathFileExistsW(save_path.c_str())) {
+ //creating new file
+ rename_error = _wrename((save_path+".tmp").c_str(),save_path.c_str())!=0;
+ } else {
+ //atomic replace for existing file
+ rename_error = !ReplaceFileW(save_path.c_str(), (save_path+".tmp").c_str(), NULL, 2|4, NULL, NULL);
+ }
save_path="";
- ERR_FAIL_COND( rename_error != 0);
+ ERR_FAIL_COND( rename_error );
}