diff --git a/src/DirManager.cpp b/src/DirManager.cpp index 586265231536f9fa6feef930c02d4c8665735766..29b428889dd3659d44e1ed8607e7af2221c2beb2 100644 --- a/src/DirManager.cpp +++ b/src/DirManager.cpp @@ -1161,6 +1161,34 @@ bool DirManager::ContainsBlockFile(const wxString &filepath) const BlockFilePtr{ it->second.lock() }; } +namespace { + bool MyCopyFile(const wxString& file1, const wxString& file2, + bool overwrite = true) + { +#ifdef __WXMSW__ + + // workaround not needed + return wxCopyFile(file1, file2, overwrite); + +#else + // PRL: Compensate for buggy wxCopyFile that returns false success, + // which was a cause of case 4 in comment 10 of + // http://bugzilla.audacityteam.org/show_bug.cgi?id=1759 + // Destination file was created, but was empty + // Bug was introduced after wxWidgets 2.8.12 at commit + // 0597e7f977c87d107e24bf3e95ebfa3d60efc249 of wxWidgets repo + + bool existed = wxFileExists(file2); + bool result = wxCopyFile(file1, file2, overwrite) && + wxFile{ file1 }.Length() == wxFile{ file2 }.Length(); + if (!result && !existed) + wxRemoveFile(file2); + return result; + +#endif + } +} + // Adds one to the reference count of the block file, // UNLESS it is "locked", then it makes a NEW copy of // the BlockFile. @@ -1204,7 +1232,7 @@ BlockFilePtr DirManager::CopyBlockFile(const BlockFilePtr &b) //a summary file, so we should check before we copy. if(b->IsSummaryAvailable()) { - if( !wxCopyFile(fn.GetFullPath(), + if( !MyCopyFile(fn.GetFullPath(), newFile.GetFullPath()) ) // Disk space exhaustion, maybe throw FileException{ @@ -1351,7 +1379,7 @@ std::pair<bool, wxString> DirManager::CopyToNewProjectDirectory(BlockFile *f) auto oldPath = oldFileNameRef.GetFullPath(); newPath = newFileName.GetFullPath(); if (summaryExisted) { - auto success = wxCopyFile(oldPath, newPath); + auto success = MyCopyFile(oldPath, newPath); if (!success) return { false, {} }; } @@ -1382,7 +1410,7 @@ std::pair<bool, wxString> DirManager::CopyToNewProjectDirectory(BlockFile *f) //if it doesn't, we can assume it was written to the NEW name, which is fine. if (oldFileName.FileExists()) { - bool ok = wxCopyFile(oldPath, newPath); + bool ok = MyCopyFile(oldPath, newPath); if (!ok) return { false, {} }; }