This is an automated email from the ASF dual-hosted git repository.
ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-io.git
The following commit(s) were added to refs/heads/master by this push:
new a92414022 IO-870: PathUtils.copyFileToDirectory (#728)
a92414022 is described below
commit a92414022d6b0b3b70ad9ed13e8137ce8b38050a
Author: David Smiley <[email protected]>
AuthorDate: Thu Mar 20 10:10:19 2025 -0400
IO-870: PathUtils.copyFileToDirectory (#728)
* IO-870: PathUtils.copyFileToDirectory
span FileSystem.
* Add test
* null check
---
src/main/java/org/apache/commons/io/file/PathUtils.java | 13 ++++++++++++-
src/test/java/org/apache/commons/io/file/PathUtilsTest.java | 10 ++++++++++
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/src/main/java/org/apache/commons/io/file/PathUtils.java
b/src/main/java/org/apache/commons/io/file/PathUtils.java
index 2cda505aa..9abdb361e 100644
--- a/src/main/java/org/apache/commons/io/file/PathUtils.java
+++ b/src/main/java/org/apache/commons/io/file/PathUtils.java
@@ -321,7 +321,18 @@ public static Path copyFile(final URL sourceFile, final
Path targetFile, final C
* @see Files#copy(Path, Path, CopyOption...)
*/
public static Path copyFileToDirectory(final Path sourceFile, final Path
targetDirectory, final CopyOption... copyOptions) throws IOException {
- return Files.copy(sourceFile,
targetDirectory.resolve(sourceFile.getFileName()), copyOptions);
+ // Path.resolve() naturally won't work across FileSystem unless we
convert to a String
+ final Path sourceFileName = sourceFile.getFileName();
+ if (sourceFileName == null) {
+ throw new IllegalArgumentException("must have a file name: " +
sourceFile);
+ }
+ final Path targetFile;
+ if (sourceFileName.getFileSystem() == targetDirectory.getFileSystem())
{
+ targetFile = targetDirectory.resolve(sourceFileName);
+ } else {
+ targetFile = targetDirectory.resolve(sourceFileName.toString());
+ }
+ return Files.copy(sourceFile, targetFile, copyOptions);
}
/**
diff --git a/src/test/java/org/apache/commons/io/file/PathUtilsTest.java
b/src/test/java/org/apache/commons/io/file/PathUtilsTest.java
index 787a13dcd..f3e6954fb 100644
--- a/src/test/java/org/apache/commons/io/file/PathUtilsTest.java
+++ b/src/test/java/org/apache/commons/io/file/PathUtilsTest.java
@@ -178,6 +178,16 @@ public void testCopyFile() throws IOException {
assertEquals(Files.size(sourceFile), Files.size(targetFile));
}
+ @Test
+ public void testCopyFileTwoFileSystem() throws IOException {
+ try (FileSystem archive = openArchive(Paths.get(TEST_JAR_PATH),
false)) {
+ final Path sourceFile = archive.getPath("next/dir/test.log");
+ final Path targetFile = PathUtils.copyFileToDirectory(sourceFile,
tempDirPath);
+ assertTrue(Files.exists(targetFile));
+ assertEquals(Files.size(sourceFile), Files.size(targetFile));
+ }
+ }
+
@Test
public void testCopyURL() throws IOException {
final Path sourceFile =
Paths.get("src/test/resources/org/apache/commons/io/dirs-1-file-size-1/file-size-1.bin");