bool UpdaterApp::StartUpdate( const wxString& source, const wxString& destination, bool silent) { const bool ret = MoveDirWithFilebackupRename( TrimSep(source), TrimSep(destination), silent); if (!ret) { ErrorMsgBox(_T("Copy failed: \n") + source + _T("\n") + destination, silent); } return ret; }
bool MoveDirWithFilebackupRename(wxString from, wxString to, bool backup, bool silent) { // first make sure that the source dir exists if (!wxDir::Exists(from)) { ErrorMsgBox(from + _T(" does not exist. Can not copy directory."), silent); return false; } if (from == to) { ErrorMsgBox(_T("Cannot copy: source == destination: ") + from, silent); return false; } if (from.empty() || to.empty()) { ErrorMsgBox(_T("Cannot copy empty directory"), silent); return false; } SafeMkdir(to); wxString sep = wxFileName::GetPathSeparator(); wxDir dir(from); wxString filename; if (!dir.GetFirst(&filename)) { return false; } // append a slash if there is not one (for easier parsing) // because who knows what people will pass to the function. if (!to.EndsWith(sep)) { to += sep; } // for both dirs if (!from.EndsWith(sep)) { from += sep; } do { const wxString srcfile = from + filename; const wxString dstfile = to + filename; if (wxDirExists(srcfile)) { //check if srcfile is a directory MoveDirWithFilebackupRename(srcfile, dstfile, false, silent); //no backup in subdirs } else { //if files exists move it to backup, this way we can use this func on windows to replace 'active' files if (backup && wxFileExists(dstfile)) { const wxString backupfile = dstfile + _T(".old"); if (!MoveFile(dstfile, backupfile)) { ErrorMsgBox(wxString::Format(_T("could not rename %s to %s. copydir aborted"), dstfile.c_str(), backupfile.c_str()), silent); return false; } } //do the actual copy if (!wxCopyFile(srcfile, dstfile, true)) { ErrorMsgBox(wxString::Format(_T("could not copy %s to %s, copydir aborted"), srcfile, dstfile), silent); return false; } } } while (dir.GetNext(&filename)); return true; }