diff --git a/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java b/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java index 55f336e2c9bd79565a47e50c018cd12f7fd86cec..b13fea4c87671637aca478788afd31a4c52421bb 100644 --- a/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java +++ b/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.common.utilities; import java.io.BufferedReader; import java.io.File; import java.io.FileFilter; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; @@ -37,6 +38,7 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import ch.systemsx.cisd.common.exceptions.CheckedExceptionTunnel; +import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; import ch.systemsx.cisd.common.logging.ISimpleLogger; /** @@ -70,6 +72,45 @@ public final class FileUtilities } }; + /** + * Copies the content of the specified source file to the specified destination file. + * + * @param sourceFile File to be copied. + * @param destinationFile File to whom content of <code>sourceFile</code> is copied. + * @param preservesLastModifiedDate If <code>true</code> the last modified date of <code>sourceFile</code> + * will be transfered to <code>destinationFile</code>. + * @throws EnvironmentFailureException if a {@link IOException} occured. + */ + public static void copyFileTo(File sourceFile, File destinationFile, boolean preservesLastModifiedDate) + throws CheckedExceptionTunnel + { + FileInputStream inputStream = null; + FileOutputStream outputStream = null; + try + { + inputStream = new FileInputStream(sourceFile); + outputStream = new FileOutputStream(destinationFile); + IOUtils.copy(inputStream, outputStream); + } catch (IOException ex) + { + throw new EnvironmentFailureException("Couldn't copy file '" + sourceFile + "' to '" + destinationFile + + "'.", ex); + } finally + { + IOUtils.closeQuietly(inputStream); + IOUtils.closeQuietly(outputStream); + } + // In Windows last modified date can only be changed of the output stream is closed + if (preservesLastModifiedDate) + { + boolean successful = destinationFile.setLastModified(sourceFile.lastModified()); + if (successful == false) + { + throw new EnvironmentFailureException("Couldn't copy last modified date of file '" + sourceFile + + "' to '" + destinationFile + "' for some unknown reason."); + } + } + } /** diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FileUtilitiesTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FileUtilitiesTest.java index 64767f8b00cb6d9a7cbc4355ab4e4669a3beb61d..5b32c76aaf5b1dd07becf2c56633392259e0e4b0 100644 --- a/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FileUtilitiesTest.java +++ b/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FileUtilitiesTest.java @@ -65,6 +65,19 @@ public class FileUtilitiesTest FileUtils.cleanDirectory(workingDirectory); } + @Test + public void testCopyFile() throws Exception + { + File sourceFile = new File(workingDirectory, "source.txt"); + FileUtilities.writeToFile(sourceFile, "hello world!"); + sourceFile.setLastModified(47110000); + assertEquals(47110000, sourceFile.lastModified()); + File destinationFile = new File(workingDirectory, "destination.txt"); + FileUtilities.copyFileTo(sourceFile, destinationFile, true); + assertEquals(FileUtilities.loadToString(sourceFile), FileUtilities.loadToString(destinationFile)); + assertEquals(47110000, destinationFile.lastModified()); + } + @Test public void testWriteToFile() throws Exception {