diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.cpp b/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.cpp index a5bce2de1..ddcf4d439 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.cpp +++ b/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.cpp @@ -1,5 +1,6 @@ #include "../../Platform/stdafx.h" #include "../../Util/StringHelpers.h" +#include "../../Util/PortableFileIO.h" #include "ConsoleSaveFileOriginal.h" #include "File.h" #include @@ -859,23 +860,19 @@ void ConsoleSaveFileOriginal::DebugFlushToFile(void *compressedData /*= NULL*/, } swprintf(fileName, XCONTENT_MAX_FILENAME_LENGTH+1, L"\\v%04d-%ls%02d.%02d.%02d.%02d.%02d.mcs",VER_PRODUCTBUILD,cutFileName.c_str(), t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond); -#ifdef _UNICODE - std::wstring wtemp = targetFileDir.getPath() + std::wstring(fileName); - LPCWSTR lpFileName = wtemp.c_str(); -#else - LPCSTR lpFileName = wstringtofilename( targetFileDir.getPath() + std::wstring(fileName) ); -#endif + const std::wstring outputPath = targetFileDir.getPath() + std::wstring(fileName); #ifndef __PSVITA__ - HANDLE hSaveFile = CreateFile( lpFileName, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, NULL); + bool writeSucceeded = false; #endif if(compressedData != NULL && compressedDataSize > 0) { #ifdef __PSVITA__ // AP - Use the access function to save - VirtualWriteFile( lpFileName, compressedData, compressedDataSize, &numberOfBytesWritten, NULL); + VirtualWriteFile( outputPath.c_str(), compressedData, compressedDataSize, &numberOfBytesWritten, NULL); #else - WriteFile( hSaveFile,compressedData,compressedDataSize,&numberOfBytesWritten,NULL); + writeSucceeded = PortableFileIO::WriteBinaryFile(outputPath, compressedData, compressedDataSize); + numberOfBytesWritten = writeSucceeded ? compressedDataSize : 0; #endif assert(numberOfBytesWritten == compressedDataSize); } @@ -883,15 +880,13 @@ void ConsoleSaveFileOriginal::DebugFlushToFile(void *compressedData /*= NULL*/, { #ifdef __PSVITA__ // AP - Use the access function to save - VirtualWriteFile( lpFileName, compressedData, compressedDataSize, &numberOfBytesWritten, NULL); + VirtualWriteFile( outputPath.c_str(), compressedData, compressedDataSize, &numberOfBytesWritten, NULL); #else - WriteFile(hSaveFile,pvSaveMem,fileSize,&numberOfBytesWritten,NULL); + writeSucceeded = PortableFileIO::WriteBinaryFile(outputPath, pvSaveMem, fileSize); + numberOfBytesWritten = writeSucceeded ? fileSize : 0; #endif assert(numberOfBytesWritten == fileSize); } -#ifndef __PSVITA__ - CloseHandle( hSaveFile ); -#endif delete[] fileName; @@ -1064,4 +1059,4 @@ void ConsoleSaveFileOriginal::ConvertToLocalPlatform() void *ConsoleSaveFileOriginal::getWritePointer(FileEntry *file) { return (char *)pvSaveMem + file->currentFilePointer;; -} \ No newline at end of file +} diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileSplit.cpp b/Minecraft.World/IO/Files/ConsoleSaveFileSplit.cpp index 5b088f628..167b580cc 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileSplit.cpp +++ b/Minecraft.World/IO/Files/ConsoleSaveFileSplit.cpp @@ -1,5 +1,6 @@ #include "../../Platform/stdafx.h" #include "../../Util/StringHelpers.h" +#include "../../Util/PortableFileIO.h" #include "ConsoleSaveFileSplit.h" #include "ConsoleSaveFileConverter.h" #include "File.h" @@ -1510,26 +1511,21 @@ void ConsoleSaveFileSplit::DebugFlushToFile(void *compressedData /*= NULL*/, uns } swprintf(fileName, XCONTENT_MAX_FILENAME_LENGTH+1, L"\\v%04d-%ls%02d.%02d.%02d.%02d.%02d.mcs",VER_PRODUCTBUILD,cutFileName.c_str(), t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond); -#ifdef _UNICODE - std::wstring wtemp = targetFileDir.getPath() + std::wstring(fileName); - LPCWSTR lpFileName = wtemp.c_str(); -#else - LPCSTR lpFileName = wstringtofilename( targetFileDir.getPath() + std::wstring(fileName) ); -#endif - - HANDLE hSaveFile = CreateFile( lpFileName, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, NULL); + const std::wstring outputPath = targetFileDir.getPath() + std::wstring(fileName); + bool writeSucceeded = false; if(compressedData != NULL && compressedDataSize > 0) { - WriteFile(hSaveFile,compressedData,compressedDataSize,&numberOfBytesWritten,NULL); + writeSucceeded = PortableFileIO::WriteBinaryFile(outputPath, compressedData, compressedDataSize); + numberOfBytesWritten = writeSucceeded ? compressedDataSize : 0; assert(numberOfBytesWritten == compressedDataSize); } else { - WriteFile(hSaveFile,pvSaveMem,fileSize,&numberOfBytesWritten,NULL); + writeSucceeded = PortableFileIO::WriteBinaryFile(outputPath, pvSaveMem, fileSize); + numberOfBytesWritten = writeSucceeded ? fileSize : 0; assert(numberOfBytesWritten == fileSize); } - CloseHandle( hSaveFile ); delete[] fileName; diff --git a/Minecraft.World/Util/PortableFileIO.h b/Minecraft.World/Util/PortableFileIO.h index 126a1448e..aed99aa31 100644 --- a/Minecraft.World/Util/PortableFileIO.h +++ b/Minecraft.World/Util/PortableFileIO.h @@ -140,4 +140,23 @@ namespace PortableFileIO return { BinaryReadStatus::ok, bytesRead, fileSize }; } + + inline bool WriteBinaryFile(const std::wstring &path, const void *buffer, std::size_t bytesToWrite) + { +#if defined(_WIN32) + std::FILE *stream = _wfopen(path.c_str(), L"wb"); +#else + const std::string nativePath = wstringtofilename(path); + std::FILE *stream = std::fopen(nativePath.c_str(), "wb"); +#endif + if (stream == NULL) + { + return false; + } + + const std::size_t bytesWritten = std::fwrite(buffer, 1, bytesToWrite, stream); + const bool failed = std::ferror(stream) != 0 || bytesWritten != bytesToWrite; + const bool closeFailed = std::fclose(stream) != 0; + return !failed && !closeFailed; + } }