From 6dcf626ab3f32b045ded3fdb0aab4c1633196eb8 Mon Sep 17 00:00:00 2001 From: Ben Soares Date: Tue, 9 Jun 2020 00:49:34 +0100 Subject: [PATCH] JAL-3628 Changed all file1.renameTo(file2) calls to Files.move(path1,path2,REPLACE_EXISTING) in jalview.io.BackupFiles. This fixes a problem in Windows with renameTo when destination file already exists. --- src/jalview/io/BackupFiles.java | 59 +++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/src/jalview/io/BackupFiles.java b/src/jalview/io/BackupFiles.java index 0d5f92b..a41af4a 100644 --- a/src/jalview/io/BackupFiles.java +++ b/src/jalview/io/BackupFiles.java @@ -28,12 +28,21 @@ import jalview.util.Platform; import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; +import jalview.bin.Cache; +import jalview.gui.Desktop; +import jalview.gui.JvOptionPane; +import jalview.util.MessageManager; + /* * BackupFiles used for manipulating (naming rolling/deleting) backup/version files when an alignment or project file is saved. * User configurable options are: @@ -96,6 +105,10 @@ public class BackupFiles private static final SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); + private static final String newTempFileSuffix = "_newfile"; + + private static final String oldTempFileSuffix = "_oldfile_tobedeleted"; + public BackupFiles(String filename) { this(new File(filename)); @@ -107,7 +120,8 @@ public class BackupFiles { classInit(); this.file = file; - BackupFilesPresetEntry bfpe = BackupFilesPresetEntry.getSavedBackupEntry(); + BackupFilesPresetEntry bfpe = BackupFilesPresetEntry + .getSavedBackupEntry(); this.suffix = bfpe.suffix; this.noMax = bfpe.keepAll; this.max = bfpe.rollMax; @@ -122,8 +136,8 @@ public class BackupFiles { String tempfilename = file.getName(); File tempdir = file.getParentFile(); - temp = File.createTempFile(tempfilename, TEMP_FILE_EXT + "_newfile", - tempdir); + temp = File.createTempFile(tempfilename, + TEMP_FILE_EXT + newTempFileSuffix, tempdir); } else { @@ -210,7 +224,7 @@ public class BackupFiles public boolean renameTempFile() { - return tempFile.renameTo(file); + return moveFileToFile(tempFile, file); } // roll the backupfiles @@ -272,7 +286,6 @@ public class BackupFiles { // backup style numbering - int tempMax = noMax ? -1 : max; // noMax == true means no limits // look for first "gap" in backupFiles @@ -288,7 +301,7 @@ public class BackupFiles tempMax = i; } } - + File previousFile = null; File fileToBeDeleted = null; for (int n = tempMax; n > 0; n--) @@ -318,7 +331,7 @@ public class BackupFiles { File oldestTempFile = nextTempFile(fileToBeDeleted.getName(), dirFile); - + if (fileToBeDeletedLMT > replacementFileLMT) { String fileToBeDeletedLMTString = sdf @@ -344,12 +357,12 @@ public class BackupFiles } else { - fileToBeDeleted.renameTo(oldestTempFile); + moveFileToFile(fileToBeDeleted, oldestTempFile); } } else { - fileToBeDeleted.renameTo(oldestTempFile); + moveFileToFile(fileToBeDeleted, oldestTempFile); addDeleteFile(oldestTempFile); } @@ -373,7 +386,7 @@ public class BackupFiles { if (previousFile != null) { - ret = ret && backupfile_n.renameTo(previousFile); + ret = ret && moveFileToFile(backupfile_n, previousFile); } } @@ -463,7 +476,7 @@ public class BackupFiles String latestBackupFilename = dir + File.separatorChar + BackupFilenameParts.getBackupFilename(nextIndexNum, basename, suffix, digits); - ret |= file.renameTo(new File(latestBackupFilename)); + ret |= moveFileToFile(file, new File(latestBackupFilename)); if (tidyUp) { @@ -565,7 +578,6 @@ public class BackupFiles null, options, options[0]); } - // return should be TRUE if file is to be deleted return (confirmButton == JvOptionPane.YES_OPTION); } @@ -622,8 +634,7 @@ public class BackupFiles } private TreeMap sortBackupFilesAsTreeMap( - File[] backupFiles, - String basename) + File[] backupFiles, String basename) { // sort the backup files (based on integer found in the suffix) using a // precomputed Hashmap for speed @@ -662,7 +673,8 @@ public class BackupFiles if (!okay) { StringBuilder messageSB = new StringBuilder(); - messageSB.append(MessageManager.getString( "label.backupfiles_confirm_save_file_backupfiles_roll_wrong")); + messageSB.append(MessageManager.getString( + "label.backupfiles_confirm_save_file_backupfiles_roll_wrong")); if (rename) { if (messageSB.length() > 0) @@ -761,4 +773,21 @@ public class BackupFiles return ret; } + private boolean moveFileToFile(File oldFile, File newFile) + { + boolean ret = false; + Path oldPath = Paths.get(oldFile.getAbsolutePath()); + Path newPath = Paths.get(newFile.getAbsolutePath()); + try + { + Files.move(oldPath, newPath, StandardCopyOption.REPLACE_EXISTING); + ret = true; + } catch (IOException e) + { + Cache.log.warn("Could not move file '" + oldPath.toString() + "' to '" + + newPath.toString() + "'"); + ret = false; + } + return ret; + } } -- 1.7.10.2