X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5fde6fcc9b551340a194ae4c726db5ab64b5c594..7699e843c07be6b26d65e9efbbb5e9d32f74d294:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index d06257478f..4cfc2036a1 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -996,8 +996,15 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil // Copy files bool -wxCopyFile (const wxString& file1, const wxString& file2) +wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) { +#if defined(__WIN32__) + // CopyFile() copies file attributes and modification time too, so use it + // instead of our code if available + // + // NB: 3rd parameter is bFailIfExists i.e. the inverse of overwrite + return ::CopyFile(file1, file2, !overwrite) != 0; +#else // !Win32 wxStructStat fbuf; // get permissions of file1 @@ -1017,7 +1024,7 @@ wxCopyFile (const wxString& file1, const wxString& file2) // remove file2, if it exists. This is needed for creating // file2 with the correct permissions in the next step - if ( wxFileExists(file2) && !wxRemoveFile(file2) ) + if ( wxFileExists(file2) && (!overwrite || !wxRemoveFile(file2))) { wxLogSysError(_("Impossible to overwrite the file '%s'"), file2.c_str()); @@ -1033,7 +1040,7 @@ wxCopyFile (const wxString& file1, const wxString& file2) // create file2 with the same permissions than file1 and open it for // writing wxFile fileOut; - if ( !fileOut.Create(file2, TRUE, fbuf.st_mode & 0777) ) + if ( !fileOut.Create(file2, overwrite, fbuf.st_mode & 0777) ) return FALSE; #ifdef __UNIX__ @@ -1058,16 +1065,25 @@ wxCopyFile (const wxString& file1, const wxString& file2) return FALSE; } + // we can expect fileIn to be closed successfully, but we should ensure + // that fileOut was closed as some write errors (disk full) might not be + // detected before doing this + if ( !fileIn.Close() || !fileOut.Close() ) + return FALSE; + #if !defined(__VISAGECPP__) && !defined(__WXMAC__) || defined(__UNIX__) -// no chmod in VA. SHould be some permission API for HPFS386 partitions however + // no chmod in VA. Should be some permission API for HPFS386 partitions + // however if ( chmod(OS_FILENAME(file2), fbuf.st_mode) != 0 ) { wxLogSysError(_("Impossible to set permissions for the file '%s'"), file2.c_str()); return FALSE; } -#endif +#endif // OS/2 || Mac + return TRUE; +#endif // __WXMSW__ && __WIN32__ } bool