One way of recursively copying a directory , or copying a file , is by using the java .nio api . This also works , with android version 8 , or higher .
import static java .lang .System .out;
import java .nio .file .Paths;
import java .nio .file .Path;
import java .nio .file .Files;
import java .nio .file .DirectoryStream;
import java .nio .file .StandardCopyOption;
import java .nio .file .LinkOption;
import java .io .IOException;
public class Copy {
public static final int final_abnormal_exit
= 1 ;
public static enum CopyFile_Options
{overWriteN_copyFile , overWriteN_copyDirectory , undefined };
public static void
main (String args [ ] ){
if (args
.length != 2 )
System .exit
(final_abnormal_exit );
Path sourcePath = Paths .get (args [0 ] );
Path destPath = Paths .get (args [1 ] );
switch (makeDecision
(sourcePath , destPath ) ){
case overWriteN_copyFile :
overWriteN_CopyFile (sourcePath, destPath );
break;
case overWriteN_copyDirectory :
overWriteN_CopyDirectory (sourcePath, destPath );
break;
default :
out .println ("undefined option selected "); }}
public static CopyFile_Options
makeDecision(Path sourcePath , Path destPath ){
if ((Files .isRegularFile
(sourcePath , LinkOption .NOFOLLOW_LINKS )
|| Files .isSymbolicLink
(sourcePath ) )
&& Files .notExists
(destPath , LinkOption .NOFOLLOW_LINKS ) )
return CopyFile_Options .overWriteN_copyFile ;
if (Files .isDirectory
(sourcePath , LinkOption .NOFOLLOW_LINKS )
&& Files .notExists
(destPath , LinkOption .NOFOLLOW_LINKS ) )
return CopyFile_Options .overWriteN_copyDirectory;
return CopyFile_Options.undefined; }
public static void
overWriteN_CopyFile (Path sourcePath , Path destPath ){
try{
Files .copy
(sourcePath , destPath ,
LinkOption .NOFOLLOW_LINKS ,
StandardCopyOption .COPY_ATTRIBUTES );
/* Files .copy by default :
Does not override destination
files or directories .
If source is a link , it will copy its
target to destination .
It does not copy the source attributes .
If source is a directory , its content are
not copied .*/ }
catch (UnsupportedOperationException |
IOException |
SecurityException exception ){
out .println (exception );
/* Files .copy also throws
DirectoryNotEmptyException and FileAlreadyExistsException ,
exceptions . They are caught using IOException ,
so it is not necessary , to catch these
exceptions .*/}}
public static void
overWriteN_CopyDirectory (Path sourcePath , Path destPath ){
overWriteN_CopyFile (sourcePath , destPath );
/*On entry copy , if directory , empty directory
created , if file , file is copied .*/
if (Files .isDirectory
(sourcePath , LinkOption .NOFOLLOW_LINKS ) ){
try(DirectoryStream <Path > paths =
Files .newDirectoryStream
(sourcePath ) ){
for (Path tc_path : paths ){
Path newDesPath = destPath .resolve(tc_path .getFileName ( ) );
// s/a -> d -> d/a
if (Files .isDirectory
(tc_path , LinkOption .NOFOLLOW_LINKS ) ){
overWriteN_CopyDirectory (tc_path , newDesPath ); }
else
overWriteN_CopyFile (tc_path , newDesPath ); }}
catch (IOException | SecurityException exception ){
/*Files .newDirectoryStream also throws
NotDirectoryException , this can be
catched using IOException .*/
out .println (exception ); } }}}
/*
$ javac Copy.java
$ java Copy source destination */