package Ġl . files . fs Ċ Ċ import Ġorg . apache . commons . io . Filename Utils Ċ import Ġjava . nio . file . Files . exists Ċ import Ġjava . nio . file . Files . isDirectory Ċ import Ġjava . nio . file . Link Option . NO FOLLOW _ LIN KS Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util . regex . Pattern Ċ Ċ /** Ċ Ġ* Ġe . g . Ġ` "/ a / b / c " Ġ=> Ġ["/ a / b / c ", Ġ"/ a / b ", Ġ"/ a ", Ġ"/ "]` Ċ Ġ*/ Ċ fun ĠPath . hierarchy (): ĠList < Path > Ġ= ĊĠ Ġgenerate Sequence ( this , ĠPath :: getParent ). toList () Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġfile Ġat Ġ` dst Dir ` Ġwith Ġthe Ġname Ġof Ġ` source `, Ġif Ġsuch Ċ Ġ* Ġfile Ġexists , Ġappend Ġa Ġnumber Ġat Ġthe Ġend Ġof Ġthe Ġfile Ġname Ġ( and Ġbefore Ġthe Ċ Ġ* Ġextension Ġif Ġit 's Ġa Ġregular Ġfile Ġuntil Ġthe Ġreturned Ġfile Ċ Ġ* Ġrepresents Ġa Ġnon existent Ġfile . Ċ Ġ*/ Ċ fun Ġget Non Ex istent Destination File ( source : ĠPath , Ġdst Dir : ĠPath ): ĠPath Ġ{ ĊĠ Ġval Ġ( base , Ġlast ) Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġis Directory ( source ) Ġ-> ĠPair ( source . fileName ?. toString () Ġ?: Ġ"", Ġ"") ĊĠĠĠ Ġelse Ġ-> ĠPair ( source . base Name Ġ?: Ġ"", Ġsource . extension With Leading Dot Ġ?: Ġ"") ĊĠ Ġ} ĊĠ Ġreturn Ġgenerate Sequence ( base ) Ġ{ Ġincrement ( base ) Ġ} ĊĠĠĠ Ġ. map Ġ{ Ġdst Dir . resolve ( it Ġ+ Ġlast ) Ġ} ĊĠĠĠ Ġ. first Ġ{ Ġ! exists ( it , ĠNO FOLLOW _ LIN KS ) Ġ} Ċ } Ċ Ċ // ĠTODO Ġmatch Ġonly Ġ"* Ġ( d + )" Ġotherwise Ġtoo Ġannoying , Ġand Ġwrong Ġwhen Ġfile Ċ // Ġ Ġis Ġdate Ġy yyy - mm - dd Ġor Ġis Ġversion Ġe . g . Ġa - 2 . 0 Ċ private Ġval ĠNAME _ WITH _ NUMBER _ SUFFIX Ġ= ĠPattern . compile ("( .*? \\ s *)( \\ d + )") Ċ Ċ private Ġfun Ġincrement ( base : ĠString ): ĠString Ġ{ ĊĠ Ġval Ġmatcher Ġ= ĠNAME _ WITH _ NUMBER _ SUFFIX . matcher ( base ) ĊĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠ Ġmatcher . matches () Ġ-> Ġmatcher . group ( 1 ) Ġ+ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġnum Ġ= Ġmatcher . group ( 2 ). to Long () ĊĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġnum Ġ< ĠLong . MAX _ VALUE Ġ-> Ġ( num Ġ+ Ġ 1 ). toString () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmatcher . group ( 2 ) Ġ+ Ġ" Ġ 2 " ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠ Ġmatcher . group ( 2 ) Ġ+ Ġ" Ġ 2 " ĊĠĠĠ Ġ} ĊĠĠĠ Ġbase Ġ== Ġ"" Ġ-> Ġ" 2 " ĊĠĠĠ Ġelse Ġ-> Ġ"$ base Ġ 2 " ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġname Ġpart Ġwithout Ġextension . Ċ Ġ* Ġ``` Ċ Ġ* Ġbase . ext Ġ Ġ-> Ġ Ġbase Ċ Ġ* Ġbase ĠĠĠĠĠ Ġ-> Ġ Ġbase Ċ Ġ* Ġbase . ĠĠĠĠ Ġ-> Ġ Ġbase . Ċ Ġ* Ġ. base . ext Ġ Ġ-> Ġ. base Ċ Ġ* Ġ. base ĠĠĠĠĠ Ġ-> Ġ. base Ċ Ġ* Ġ. base . ĠĠĠĠ Ġ-> Ġ. base . Ċ Ġ* Ġ. ĠĠĠĠĠĠĠĠĠ Ġ-> Ġ. Ċ Ġ* Ġ.. ĠĠĠĠĠĠĠĠ Ġ-> Ġ.. Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ val ĠPath . base Name : ĠString ? ĊĠ Ġget () Ġ{ ĊĠĠĠ Ġval Ġname Ġ= ĠfileName ?. toString () Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠ Ġname . lastIndexOf (".") Ġ== Ġ 0 Ġ-> Ġname ĊĠĠĠĠĠ Ġelse Ġ-> ĠFilename Utils . getBase Name ( name ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠThe Ġextension Ġpart Ġwithout Ġbase Ġname . Ċ Ġ* Ġ``` Ċ Ġ* Ġbase . ext Ġ Ġ-> Ġ Ġext Ċ Ġ* Ġ. base . ext Ġ Ġ-> Ġ Ġext Ċ Ġ* Ġbase ĠĠĠĠĠ Ġ-> Ġ Ġ"" Ċ Ġ* Ġbase . ĠĠĠĠ Ġ-> Ġ Ġ"" Ċ Ġ* Ġ. base ĠĠĠĠĠ Ġ-> Ġ Ġ"" Ċ Ġ* Ġ. base . ĠĠĠĠ Ġ-> Ġ Ġ"" Ċ Ġ* Ġ. ĠĠĠĠĠĠĠĠĠ Ġ-> Ġ Ġ"" Ċ Ġ* Ġ.. ĠĠĠĠĠĠĠĠ Ġ-> Ġ Ġ"" Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ private Ġval ĠPath . extension : ĠString ? ĊĠ Ġget () Ġ{ ĊĠĠĠ Ġval Ġname Ġ= ĠfileName ?. toString () Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġ( when Ġ{ ĊĠĠĠĠĠ Ġname . lastIndexOf (".") Ġ== Ġ 0 Ġ-> Ġnull ĊĠĠĠĠĠ Ġelse Ġ-> ĠFilename Utils . getExtension ( name ) ĊĠĠĠ Ġ}) ?. take If Ġ{ Ġit . isNotEmpty () Ġ} ĊĠ Ġ} Ċ Ċ private Ġval ĠPath . extension With Leading Dot : ĠString ? ĊĠ Ġget () Ġ{ ĊĠĠĠ Ġreturn Ġ". ${ extension Ġ?: Ġreturn Ġnull }" ĊĠ Ġ} Ċ