Skip to content

Commit e295fae

Browse files
author
Niall Pemberton
committed
IO-190 FileUtils copyDirectory preserves destination subdirectories, rather than overwriting with the source subdirectories - thanks to Jukka for the pacth
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/io/trunk@1002796 13f79535-47bb-0310-9956-ffa450edef68
1 parent a8e9eef commit e295fae

2 files changed

Lines changed: 56 additions & 3 deletions

File tree

src/java/org/apache/commons/io/FileUtils.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,9 +1081,6 @@ private static void doCopyDirectory(File srcDir, File destDir, FileFilter filter
10811081
if (destDir.mkdirs() == false) {
10821082
throw new IOException("Destination '" + destDir + "' directory cannot be created");
10831083
}
1084-
if (preserveFileDate) {
1085-
destDir.setLastModified(srcDir.lastModified());
1086-
}
10871084
}
10881085
if (destDir.canWrite() == false) {
10891086
throw new IOException("Destination '" + destDir + "' cannot be written to");
@@ -1098,6 +1095,11 @@ private static void doCopyDirectory(File srcDir, File destDir, FileFilter filter
10981095
}
10991096
}
11001097
}
1098+
1099+
// Do this last, as the above has probably affected directory metadata
1100+
if (preserveFileDate) {
1101+
destDir.setLastModified(srcDir.lastModified());
1102+
}
11011103
}
11021104

11031105
//-----------------------------------------------------------------------

src/test/org/apache/commons/io/FileUtilsTestCase.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -906,6 +906,57 @@ public void testCopyDirectoryFiltered() throws Exception {
906906
assertEquals("file3.txt", files.get(2).getName());
907907
}
908908

909+
public void testCopyDirectoryPreserveDates() throws Exception {
910+
File source = new File(getTestDirectory(), "source");
911+
File sourceDirectory = new File(source, "directory");
912+
File sourceFile = new File(sourceDirectory, "hello.txt");
913+
914+
// Prepare source data
915+
source.mkdirs();
916+
sourceDirectory.mkdir();
917+
FileUtils.writeStringToFile(sourceFile, "HELLO WORLD", "UTF8");
918+
// Set dates in reverse order to avoid overwriting previous values
919+
// Also, use full seconds (arguments are in ms) close to today
920+
// but still highly unlikely to occur in the real world
921+
sourceFile.setLastModified(1000000002000L);
922+
sourceDirectory.setLastModified(1000000001000L);
923+
source.setLastModified(1000000000000L);
924+
925+
File target = new File(getTestDirectory(), "target");
926+
File targetDirectory = new File(target, "directory");
927+
File targetFile = new File(targetDirectory, "hello.txt");
928+
929+
// Test with preserveFileDate disabled
930+
FileUtils.copyDirectory(source, target, false);
931+
assertTrue(1000000000000L != target.lastModified());
932+
assertTrue(1000000001000L != targetDirectory.lastModified());
933+
assertTrue(1000000002000L != targetFile.lastModified());
934+
FileUtils.deleteDirectory(target);
935+
936+
// Test with preserveFileDate enabled
937+
FileUtils.copyDirectory(source, target, true);
938+
assertEquals(1000000000000L, target.lastModified());
939+
assertEquals(1000000001000L, targetDirectory.lastModified());
940+
assertEquals(1000000002000L, targetFile.lastModified());
941+
FileUtils.deleteDirectory(target);
942+
943+
// also if the target directory already exists (IO-190)
944+
target.mkdirs();
945+
FileUtils.copyDirectory(source, target, true);
946+
assertEquals(1000000000000L, target.lastModified());
947+
assertEquals(1000000001000L, targetDirectory.lastModified());
948+
assertEquals(1000000002000L, targetFile.lastModified());
949+
FileUtils.deleteDirectory(target);
950+
951+
// also if the target subdirectory already exists (IO-190)
952+
targetDirectory.mkdirs();
953+
FileUtils.copyDirectory(source, target, true);
954+
assertEquals(1000000000000L, target.lastModified());
955+
assertEquals(1000000001000L, targetDirectory.lastModified());
956+
assertEquals(1000000002000L, targetFile.lastModified());
957+
FileUtils.deleteDirectory(target);
958+
}
959+
909960
/** Test for IO-141 */
910961
public void testCopyDirectoryToChild() throws Exception {
911962
File grandParentDir = new File(getTestDirectory(), "grandparent");

0 commit comments

Comments
 (0)