package Ġb alt i . file x Ċ Ċ import Ġb alt i . file x . exceptions .* Ċ import Ġjava . io . IOException Ċ Ċ internal Ġclass ĠCopy ( private Ġval Ġf : ĠFile X ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLogic Ġcompletely Ġcopied Ġfrom Ġ[ kotlin . io . copy To ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġis Ġused Ġto Ġcopy Ġa Ġsingle Ġfile Ġ/ Ġdocument . ĊĠĠĠĠ Ġ* ĠIf Ġrun Ġon Ġa Ġdirectory , Ġthen Ġonly Ġa Ġblank Ġdirectory Ġis Ġcreated Ġat Ġthe Ġ[ target ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtarget ĠLocation Ġwhere Ġthe Ġcurrent Ġfile Ġ/ Ġdocument Ġis Ġto Ġbe Ġcopied . ĊĠĠĠĠ Ġ* Ġ@ param Ġoverwrite ĠIf Ġ` true `, Ġif Ġa Ġfile Ġexists Ġat Ġthe Ġ[ target ] Ġlocation , ĊĠĠĠĠ Ġ* Ġthen Ġthat Ġfile Ġ/ Ġdocument Ġis Ġdeleted Ġand Ġthe Ġcurrent Ġfile Ġis Ġcopied Ġin Ġthe Ġtarget Ġlocation . ĊĠĠĠĠ Ġ* ĠDefault Ġvalue Ġis Ġ` false `. ĊĠĠĠĠ Ġ* Ġ@ param ĠbufferSize ĠInt Ġspecifying Ġthe Ġbuffer Ġsize Ġto Ġbe Ġused Ġwhile Ġcopying . ĠDefault Ġvalue Ġis Ġ[ DEFAULT _ BUFFER _ SIZE ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġ[ target ] Ġfile . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠNoSuch File X Exception ĠIf Ġthe Ġsource Ġfile Ġdoesn 't Ġexist . ĊĠĠĠĠ Ġ* Ġ@ throws ĠFile X AlreadyExists Exception ĠIf Ġthe Ġdestination Ġfile Ġalready Ġexists Ġand Ġ[ overwrite ] Ġargument Ġis Ġset Ġto Ġ` false `. ĊĠĠĠĠ Ġ* Ġ@ throws ĠFile X System Exception ĠIf Ġthe Ġsource Ġis Ġa Ġdirectory , Ġthis Ġfunction Ġonly Ġcreates Ġand Ġempty Ġdirectory Ġat Ġ[ target ]. ĊĠĠĠĠ Ġ* ĠThis Ġexception Ġis Ġthrown Ġif Ġcreating Ġthe Ġempty Ġdirectory Ġfails . ĊĠĠĠĠ Ġ* Ġ@ throws ĠNullPointerException ĠIf Ġthe Ġinput Ġstream Ġ( from Ġsource ) Ġor Ġoutput Ġstream Ġ( to Ġtarget ) Ġis Ġnull . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĠIf Ġany Ġerrors Ġoccur Ġwhile Ġcopying . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcopy To ( target : ĠFile X , Ġoverwrite : ĠBoolean Ġ= Ġfalse , ĠbufferSize : ĠInt Ġ= ĠDEFAULT _ BUFFER _ SIZE ): ĠFile X Ġ= Ġf . run Ġ{ ĊĊĠĠĠĠĠĠĠ Ġrefresh File () ĊĠĠĠĠĠĠĠ Ġtarget . refresh File () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNoSuch File X Exception ( file Ġ= Ġthis , Ġreason Ġ= Ġ" The Ġsource Ġfile Ġdoesn 't Ġexist .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( target . exists ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! overwrite ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFile X AlreadyExists Exception ( file Ġ= Ġthis , Ġother Ġ= Ġtarget , Ġ" The Ġdestination Ġfile Ġalready Ġexists .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(! target . delete ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFile X AlreadyExists Exception ( file Ġ= Ġthis , Ġother Ġ= Ġtarget , Ġ" Tri ed Ġto Ġoverwrite Ġthe Ġdestination , Ġbut Ġfailed Ġto Ġdelete Ġit .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! target . mkdir s ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFile X System Exception ( this , Ġtarget , Ġ" Failed Ġto Ġcreate Ġtarget Ġdirectory .") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . createNew File ( make Directories Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġf . inputStream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= Ġtarget . output Stream () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inputStream Ġ== Ġnull ) Ġthrow ĠNullPointerException (" Input Ġstream Ġis Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Stream Ġ== Ġnull ) Ġthrow ĠNullPointerException (" Output Ġstream Ġis Ġnull ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . use Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . use Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . copy To ( output , ĠbufferSize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtarget ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLogic Ġcompletely Ġcopied Ġfrom Ġ[ kotlin . io . copy Re cursively ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġis Ġused Ġto Ġrecursively Ġcopy Ġa Ġdirectory Ġwith Ġfiles Ġand Ġsub directories Ġinside . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtarget ĠLocation Ġwhere Ġthe Ġcurrent Ġdirectory Ġis Ġto Ġbe Ġcopied . ĊĠĠĠĠ Ġ* Ġ@ param Ġoverwrite ĠIf Ġ` true `, Ġthen Ġif Ġconflicting Ġfiles Ġand Ġdirectories Ġexists Ġinside Ġ[ target ] Ġlocation , ĊĠĠĠĠ Ġ* Ġthen Ġthey Ġare Ġdeleted Ġand Ġthe Ġsource Ġfile Ġ/ Ġsub directories Ġare Ġcopied . ĊĠĠĠĠ Ġ* ĠDefault Ġvalue Ġis Ġ` false `. ĊĠĠĠĠ Ġ* Ġ@ param ĠonError ĠIf Ġany Ġerrors Ġoccur Ġduring Ġthe Ġcopying , Ġthen Ġfurther Ġactions Ġwill Ġdepend Ġon Ġthe Ġresult Ġof Ġthe Ġcall ĊĠĠĠĠ Ġ* Ġto Ġ` onError ( File , ĠIOException )` Ġfunction , Ġthat Ġwill Ġbe Ġcalled Ġwith Ġarguments , ĊĠĠĠĠ Ġ* Ġspecifying Ġthe Ġfile Ġthat Ġcaused Ġthe Ġerror Ġand Ġthe Ġexception Ġitself . ĊĠĠĠĠ Ġ* ĠBy Ġdefault Ġthis Ġfunction Ġre throws Ġexceptions . ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġis Ġalso Ġexpected Ġto Ġreturn Ġone Ġof Ġ[ OnError Action ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġdelete After Copy ĠThis Ġis Ġan Ġinternal Ġflag Ġand Ġnot Ġavailable Ġoutside Ġthe Ġlibrary . ĊĠĠĠĠ Ġ* ĠIf Ġset Ġto Ġ` true `, Ġthe Ġsource Ġfile Ġis Ġdeleted Ġafter Ġcopying Ġto Ġtarget Ġlocation . ĠThis Ġacts Ġas Ġmoving Ġthe Ġfile . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠExceptions Ġthat Ġcan Ġbe Ġpassed Ġto Ġthe Ġ` onError ` Ġfunction : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- Ġ[ NoSuch File X Exception ] Ġ- Ġif Ġthere Ġwas Ġan Ġattempt Ġto Ġcopy Ġa Ġnon - existent Ġfile ĊĠĠĠĠ Ġ* Ġ- Ġ[ File X AlreadyExists Exception ] Ġ- Ġif Ġthere Ġis Ġa Ġconflict ĊĠĠĠĠ Ġ* Ġ- Ġ[ Access Denied Exception ] Ġ- Ġif Ġthere Ġwas Ġan Ġattempt Ġto Ġopen Ġa Ġdirectory Ġthat Ġdidn 't Ġsucceed . ĊĠĠĠĠ Ġ* Ġ- Ġ[ IOException ] Ġ- Ġif Ġsome Ġproblems Ġoccur Ġwhen Ġcopying . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠFile X Terminate Exception Ġif Ġ[ onError ] Ġreturns Ġ[ OnError Action . TERMIN ATE ] ĊĠĠĠĠ Ġ* Ġ@ return Ġ` false ` Ġif Ġthe Ġcopying Ġwas Ġterminated , Ġ` true ` Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcopy Re cursively ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget : ĠFile X , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverwrite : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError : Ġ( File X , ĠException ) Ġ-> ĠOn ErrorAction Ġ= Ġ{ Ġ_, Ġexception Ġ-> Ġthrow Ġexception Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete After Copy : ĠBoolean Ġ= Ġfalse Ġ Ġ// Ġinternal Ġflag Ġused Ġto Ġmove Ġfiles . ĊĠĠĠ Ġ): ĠBoolean Ġ= Ġf . run Ġ{ ĊĊĠĠĠĠĠĠĠ Ġthis . refresh File () ĊĠĠĠĠĠĠĠ Ġtarget . refresh File () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠonError ( this , ĠNoSuch File X Exception ( file Ġ= Ġthis , Ġreason Ġ= Ġ" The Ġsource Ġfile Ġdoesn 't Ġexist .")) Ġ!= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOn ErrorAction . TERMIN ATE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcannot Ġbreak Ġfor Ġloop Ġfrom Ġinside Ġa Ġlambda , Ġso Ġwe Ġhave Ġto Ġuse Ġan Ġexception Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( src Ġin Ġwalk Top Down (). on Fail Ġ{ Ġf , Ġe Ġ-> Ġif Ġ( onError ( f , Ġe ) Ġ== ĠOn ErrorAction . TERMIN ATE ) Ġthrow ĠFile X Terminate Exception ( f ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! src . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( onError ( src , ĠNoSuch File X Exception ( file Ġ= Ġsrc , Ġreason Ġ= Ġ" The Ġsource Ġfile Ġdoesn 't Ġexist .")) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOn ErrorAction . TERMIN ATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġown Ġlogic : Ġdifferent Ġfrom Ġkotlin . io . copy Re cursively () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrel Path Ġ= Ġsrc . canonical Path . substring ( this . canonical Path . length ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremove Ġleading Ġ'/' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . startsWith ('/ ')) Ġit . substring ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Path Ġ= Ġtarget . path . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġtrailing Ġ'/' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . endsWith ('/ ')) Ġit Ġelse Ġ"$ it /" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdst File Ġ= ĠFile X . new ("${ target Path }$ rel Path ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ***** ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dst File . exists () Ġ&& Ġ!( src . isDirectory Ġ&& Ġdst File . isDirectory )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstill Exists Ġ= Ġif Ġ(! overwrite ) Ġtrue Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dst File . isDirectory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! dst File . delete Re cursively () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! dst File . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( still Exists ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( onError ( dst File , ĠFile X AlreadyExists Exception ( file Ġ= Ġsrc , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġ= Ġdst File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreason Ġ= Ġ" The Ġdestination Ġfile Ġalready Ġexists .")) Ġ== ĠOn ErrorAction . TERMIN ATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdst File . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src . copy To ( dst File , Ġoverwrite ). length () Ġ!= Ġsrc . length ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( onError ( src , ĠIOException (" Source Ġfile Ġwasn 't Ġcopied Ġcompletely , Ġlength Ġof Ġdestination Ġfile Ġdiffers .")) Ġ== ĠOn ErrorAction . TERMIN ATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdelete After Copy Ġis Ġan Ġinternal Ġflag Ġused Ġto Ġmove Ġfiles . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( delete After Copy ) Ġsrc . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFile X System Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }