You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Andrew Shcheglov (Jira)" <ji...@apache.org> on 2021/02/06 18:35:00 UTC

[jira] [Commented] (IO-719) PathUtils.copyDirectory() does not work when source and dest belong to different filesystems

    [ https://issues.apache.org/jira/browse/IO-719?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17280257#comment-17280257 ] 

Andrew Shcheglov commented on IO-719:
-------------------------------------

Possible solution: stringize relative path inside"resolve()" in "CopyDirectoryVizitor.preVizitDirectory()" and "CopyDirectoryVizitor.vizitFile()", like here:

{code:java}
@Override
public FileVisitResult preVisitDirectory(final Path directory, final BasicFileAttributes attributes)
	throws IOException {
	final Path newTargetDir = targetDirectory.resolve(sourceDirectory.relativize(directory).toString());
	if (Files.notExists(newTargetDir)) {
		Files.createDirectory(newTargetDir);
	}
	return super.preVisitDirectory(directory, attributes);
}

@Override
public FileVisitResult visitFile(final Path sourceFile, final BasicFileAttributes attributes) throws IOException {
	final Path targetFile = targetDirectory.resolve(sourceDirectory.relativize(sourceFile).toString());
	copy(sourceFile, targetFile);
	return super.visitFile(targetFile, attributes);
}
{code}


> PathUtils.copyDirectory() does not work when source and dest belong to different filesystems
> --------------------------------------------------------------------------------------------
>
>                 Key: IO-719
>                 URL: https://issues.apache.org/jira/browse/IO-719
>             Project: Commons IO
>          Issue Type: Bug
>          Components: Utilities
>    Affects Versions: 2.8.0
>         Environment: Java 8, Linux
>            Reporter: Andrew Shcheglov
>            Priority: Major
>
> This code:
> {code:java}
> @Test
> public void pathUtilsCopyDirFailure() throws IOException {
> 	FileSystem fs1 = Jimfs.newFileSystem();
> 	Path srcDir = fs1.getPath("srcDir");
> 	// Create files/dirs in srcDir
> 	Path targetDir = Paths.get("targetDir");
> 	PathUtils.copyDirectory(srcDir, targetDir);
> }
> {code}
> throws exception:
> {noformat}
> java.nio.file.ProviderMismatchException
> 	at java.base/sun.nio.fs.UnixPath.toUnixPath(UnixPath.java:198)
> 	at java.base/sun.nio.fs.UnixPath.resolve(UnixPath.java:410)
> 	at java.base/sun.nio.fs.UnixPath.resolve(UnixPath.java:43)
> 	at org.apache.commons.io.file.CopyDirectoryVisitor.preVisitDirectory(CopyDirectoryVisitor.java:130)
> 	at org.apache.commons.io.file.CopyDirectoryVisitor.preVisitDirectory(CopyDirectoryVisitor.java:36)
> 	at java.base/java.nio.file.Files.walkFileTree(Files.java:2731)
> 	at java.base/java.nio.file.Files.walkFileTree(Files.java:2796)
> 	at org.apache.commons.io.file.PathUtils.visitFileTree(PathUtils.java:687)
> 	at org.apache.commons.io.file.PathUtils.copyDirectory(PathUtils.java:196)
> {noformat}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)