diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index 03a6385190..8321d83bbe 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -220,6 +220,17 @@ bool DirectoryFileHandle::Open(std::string &basePath, std::string &fileName, Fil bool success = hFile != INVALID_HANDLE_VALUE; if (!success) { DWORD w32err = GetLastError(); + + if (w32err == ERROR_SHARING_VIOLATION) { + // Sometimes, the file is locked for write, let's try again. + sharemode |= FILE_SHARE_WRITE; + hFile = CreateFile(ConvertUTF8ToWString(fullName).c_str(), desired, sharemode, 0, openmode, 0, 0); + success = hFile != INVALID_HANDLE_VALUE; + if (!success) { + w32err = GetLastError(); + } + } + if (w32err == ERROR_DISK_FULL || w32err == ERROR_NOT_ENOUGH_QUOTA) { // This is returned when the disk is full. I18NCategory *err = GetI18NCategory("Error"); diff --git a/Windows/MainWindowMenu.cpp b/Windows/MainWindowMenu.cpp index c70e7f72de..3a6de2fc42 100644 --- a/Windows/MainWindowMenu.cpp +++ b/Windows/MainWindowMenu.cpp @@ -842,9 +842,11 @@ namespace MainWindow { FILE *fp = File::OpenCFile(fn, "wb"); u32 handle = pspFileSystem.OpenFile(filename, FILEACCESS_READ, ""); u8 buffer[4096]; - while (pspFileSystem.ReadFile(handle, buffer, sizeof(buffer)) > 0) { - fwrite(buffer, sizeof(buffer), 1, fp); - } + size_t bytes; + do { + bytes = pspFileSystem.ReadFile(handle, buffer, sizeof(buffer)); + fwrite(buffer, 1, bytes, fp); + } while (bytes == sizeof(buffer)); pspFileSystem.CloseFile(handle); fclose(fp); }