Author: niallp
Date: Wed Sep 29 18:13:37 2010
New Revision: 1002796
URL: http://svn.apache.org/viewvc?rev=1002796&view=rev
Log:
IO-190 FileUtils copyDirectory preserves destination subdirectories, rather
than overwriting with the source subdirectories - thanks to Jukka for the pacth
Modified:
commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java
commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java
Modified: commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java
URL:
http://svn.apache.org/viewvc/commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java?rev=1002796&r1=1002795&r2=1002796&view=diff
==============================================================================
--- commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java
(original)
+++ commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java Wed
Sep 29 18:13:37 2010
@@ -1081,9 +1081,6 @@ public class FileUtils {
if (destDir.mkdirs() == false) {
throw new IOException("Destination '" + destDir + "' directory
cannot be created");
}
- if (preserveFileDate) {
- destDir.setLastModified(srcDir.lastModified());
- }
}
if (destDir.canWrite() == false) {
throw new IOException("Destination '" + destDir + "' cannot be
written to");
@@ -1098,6 +1095,11 @@ public class FileUtils {
}
}
}
+
+ // Do this last, as the above has probably affected directory metadata
+ if (preserveFileDate) {
+ destDir.setLastModified(srcDir.lastModified());
+ }
}
//-----------------------------------------------------------------------
Modified:
commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java
URL:
http://svn.apache.org/viewvc/commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java?rev=1002796&r1=1002795&r2=1002796&view=diff
==============================================================================
---
commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java
(original)
+++
commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java
Wed Sep 29 18:13:37 2010
@@ -906,6 +906,57 @@ public class FileUtilsTestCase extends F
assertEquals("file3.txt", files.get(2).getName());
}
+ public void testCopyDirectoryPreserveDates() throws Exception {
+ File source = new File(getTestDirectory(), "source");
+ File sourceDirectory = new File(source, "directory");
+ File sourceFile = new File(sourceDirectory, "hello.txt");
+
+ // Prepare source data
+ source.mkdirs();
+ sourceDirectory.mkdir();
+ FileUtils.writeStringToFile(sourceFile, "HELLO WORLD", "UTF8");
+ // Set dates in reverse order to avoid overwriting previous values
+ // Also, use full seconds (arguments are in ms) close to today
+ // but still highly unlikely to occur in the real world
+ sourceFile.setLastModified(1000000002000L);
+ sourceDirectory.setLastModified(1000000001000L);
+ source.setLastModified(1000000000000L);
+
+ File target = new File(getTestDirectory(), "target");
+ File targetDirectory = new File(target, "directory");
+ File targetFile = new File(targetDirectory, "hello.txt");
+
+ // Test with preserveFileDate disabled
+ FileUtils.copyDirectory(source, target, false);
+ assertTrue(1000000000000L != target.lastModified());
+ assertTrue(1000000001000L != targetDirectory.lastModified());
+ assertTrue(1000000002000L != targetFile.lastModified());
+ FileUtils.deleteDirectory(target);
+
+ // Test with preserveFileDate enabled
+ FileUtils.copyDirectory(source, target, true);
+ assertEquals(1000000000000L, target.lastModified());
+ assertEquals(1000000001000L, targetDirectory.lastModified());
+ assertEquals(1000000002000L, targetFile.lastModified());
+ FileUtils.deleteDirectory(target);
+
+ // also if the target directory already exists (IO-190)
+ target.mkdirs();
+ FileUtils.copyDirectory(source, target, true);
+ assertEquals(1000000000000L, target.lastModified());
+ assertEquals(1000000001000L, targetDirectory.lastModified());
+ assertEquals(1000000002000L, targetFile.lastModified());
+ FileUtils.deleteDirectory(target);
+
+ // also if the target subdirectory already exists (IO-190)
+ targetDirectory.mkdirs();
+ FileUtils.copyDirectory(source, target, true);
+ assertEquals(1000000000000L, target.lastModified());
+ assertEquals(1000000001000L, targetDirectory.lastModified());
+ assertEquals(1000000002000L, targetFile.lastModified());
+ FileUtils.deleteDirectory(target);
+ }
+
/** Test for IO-141 */
public void testCopyDirectoryToChild() throws Exception {
File grandParentDir = new File(getTestDirectory(), "grandparent");