diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java index a11b8adc5..c7a0b672b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java @@ -359,7 +359,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener { long now = _context.clock().now(); if (_tempFile.exists()) { - boolean copied = FileUtil.copy(_tempFile.getAbsolutePath(), _newsFile.getAbsolutePath(), true); + boolean copied = FileUtil.copy(_tempFile, _newsFile, true, false); if (copied) { _lastUpdated = now; _tempFile.delete(); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/UnsignedUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/UnsignedUpdateHandler.java index 2eb132b30..90e120af6 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/UnsignedUpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/UnsignedUpdateHandler.java @@ -93,8 +93,8 @@ public class UnsignedUpdateHandler extends UpdateHandler { _log.log(Log.CRIT, "Corrupt zip file from " + url); return; } - String to = (new File(_context.getRouterDir(), Router.UPDATE_FILE)).getAbsolutePath(); - boolean copied = FileUtil.copy(_updateFile, to, true); + File to = new File(_context.getRouterDir(), Router.UPDATE_FILE); + boolean copied = FileUtil.copy(updFile, to, true, false); if (copied) { updFile.delete(); String policy = _context.getProperty(ConfigUpdateHandler.PROP_UPDATE_POLICY); @@ -124,7 +124,7 @@ public class UnsignedUpdateHandler extends UpdateHandler { } } else { _log.log(Log.CRIT, "Failed copy to " + to); - updateStatus("" + _("Failed copy to {0}", to) + ""); + updateStatus("" + _("Failed copy to {0}", to.getAbsolutePath()) + ""); } } } diff --git a/core/java/src/freenet/support/CPUInformation/CPUID.java b/core/java/src/freenet/support/CPUInformation/CPUID.java index 439555fce..62b12952a 100644 --- a/core/java/src/freenet/support/CPUInformation/CPUID.java +++ b/core/java/src/freenet/support/CPUInformation/CPUID.java @@ -402,7 +402,7 @@ public class CPUID { } // copy to install dir, ignore failure File newFile = new File(I2PAppContext.getGlobalContext().getBaseDir(), filename); - FileUtil.copy(outFile.getAbsolutePath(), newFile.getAbsolutePath(), false, true); + FileUtil.copy(outFile, newFile, false, true); return true; } diff --git a/core/java/src/net/i2p/client/naming/SingleFileNamingService.java b/core/java/src/net/i2p/client/naming/SingleFileNamingService.java index 6d7926f40..7013fb77a 100644 --- a/core/java/src/net/i2p/client/naming/SingleFileNamingService.java +++ b/core/java/src/net/i2p/client/naming/SingleFileNamingService.java @@ -193,7 +193,7 @@ public class SingleFileNamingService extends NamingService { out.write(d.toBase64()); out.newLine(); out.close(); - boolean success = rename(tmp, _file); + boolean success = FileUtil.rename(tmp, _file); if (success) { for (NamingServiceListener nsl : _listeners) { nsl.entryChanged(this, hostname, d, options); @@ -284,7 +284,7 @@ public class SingleFileNamingService extends NamingService { tmp.delete(); return false; } - success = rename(tmp, _file); + success = FileUtil.rename(tmp, _file); if (success) { for (NamingServiceListener nsl : _listeners) { nsl.entryRemoved(this, hostname); @@ -442,24 +442,6 @@ public class SingleFileNamingService extends NamingService { } } - private static boolean rename(File from, File to) { - boolean success = false; - boolean isWindows = System.getProperty("os.name").startsWith("Win"); - // overwrite fails on windows - if (!isWindows) - success = from.renameTo(to); - if (!success) { - to.delete(); - success = from.renameTo(to); - if (!success) { - // hard way - success = FileUtil.copy(from.getAbsolutePath(), to.getAbsolutePath(), true, true); - from.delete(); - } - } - return success; - } - private void getReadLock() { _fileLock.readLock().lock(); } diff --git a/core/java/src/net/i2p/util/FileUtil.java b/core/java/src/net/i2p/util/FileUtil.java index de9d354aa..4231eb05d 100644 --- a/core/java/src/net/i2p/util/FileUtil.java +++ b/core/java/src/net/i2p/util/FileUtil.java @@ -400,7 +400,15 @@ public class FileUtil { public static boolean copy(String source, String dest, boolean overwriteExisting, boolean quiet) { File src = new File(source); File dst = new File(dest); + return copy(src, dst, overwriteExisting, quiet); + } + /** + * @param quiet don't log fails to wrapper log if true + * @return true if it was copied successfully + * @since 0.8.8 + */ + public static boolean copy(File src, File dst, boolean overwriteExisting, boolean quiet) { if (dst.exists() && dst.isDirectory()) dst = new File(dst, src.getName()); @@ -429,6 +437,35 @@ public class FileUtil { } } + /** + * Try to rename, if it doesn't work then copy and delete the old. + * Always overwrites any existing "to" file. + * Method moved from SingleFileNamingService. + * + * @return true if it was renamed / copied successfully + * @since 0.8.8 + */ + public static boolean rename(File from, File to) { + if (!from.exists()) + return false; + boolean success = false; + boolean isWindows = System.getProperty("os.name").startsWith("Win"); + // overwrite fails on windows + if (!isWindows) + success = from.renameTo(to); + if (!success) { + to.delete(); + success = from.renameTo(to); + if (!success) { + // hard way + success = copy(from, to, true, true); + if (success) + from.delete(); + } + } + return success; + } + /** * Usage: FileUtil (delete path | copy source dest | unzip path.zip) * diff --git a/core/java/src/net/i2p/util/NativeBigInteger.java b/core/java/src/net/i2p/util/NativeBigInteger.java index b1de68e55..312babe83 100644 --- a/core/java/src/net/i2p/util/NativeBigInteger.java +++ b/core/java/src/net/i2p/util/NativeBigInteger.java @@ -606,7 +606,7 @@ public class NativeBigInteger extends BigInteger { } // copy to install dir, ignore failure File newFile = new File(I2PAppContext.getGlobalContext().getBaseDir(), filename); - FileUtil.copy(outFile.getAbsolutePath(), newFile.getAbsolutePath(), false, true); + FileUtil.copy(outFile, newFile, false, true); return true; }