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;
}