/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 4 - 2 0 2 0 ĠAr pit ĠK hur ana Ġ< arp it kh 9 6 @ gmail . com >, ĠV ish al ĠNe h ra Ġ< v ish al me ham 2 @ gmail . com >, Ċ Ġ* ĠEm man uel ĠMess ul am < em man uel b end avid @ gmail . com >, ĠRay mond ĠL ai Ġ< air wave 2 0 9 gt Ġat Ġg mail . com > Ġand ĠContributors . Ċ Ġ* Ċ Ġ* ĠThis Ġfile Ġis Ġpart Ġof ĠA ma ze ĠFile ĠManager . Ċ Ġ* Ċ Ġ* ĠA ma ze ĠFile ĠManager Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ċ Ġ* Ġit Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ċ Ġ* Ġthe ĠFree ĠSoftware ĠFoundation , Ġeither Ġversion Ġ 3 Ġof Ġthe ĠLicense , Ġor Ċ Ġ* Ġ( at Ġyour Ġoption ) Ġany Ġlater Ġversion . Ċ Ġ* Ċ Ġ* ĠThis Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ċ Ġ* Ġbut ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof Ċ Ġ* ĠMERCHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe Ċ Ġ* ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . Ċ Ġ* Ċ Ġ* ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ Ġ* Ġalong Ġwith Ġthis Ġprogram . Ġ ĠIf Ġnot , Ġsee Ġ< http :// www . gnu . org / licenses />. Ċ Ġ*/ Ċ Ċ package Ġcom . amaz e . file manager . filesystem . root Ċ Ċ import Ġandroid . preference . Preference Manager Ċ import Ġandroid . util . Log Ċ import Ġcom . amaz e . file manager . R Ċ import Ġcom . amaz e . file manager . application . AppConfig Ċ import Ġcom . amaz e . file manager . exceptions . Shell Command Invalid Exception Ċ import Ġcom . amaz e . file manager . exceptions . Shell Not Running Exception Ċ import Ġcom . amaz e . file manager . file _ operations . filesystem . Open Mode Ċ import Ġcom . amaz e . file manager . filesystem . Hybrid File Parcelable Ċ import Ġcom . amaz e . file manager . filesystem . Root Helper Ċ import Ġcom . amaz e . file manager . filesystem . files . FileUtils Ċ import Ġcom . amaz e . file manager . filesystem . root . base . IR oot Command Ċ import Ġcom . amaz e . file manager . ui . fragments . preference _ fragments . Preferences Constants Ċ import Ġjava . io . File Ċ import Ġkotlin . collections . ArrayList Ċ Ċ object ĠList Files Command Ġ: ĠI Root Command () Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG : ĠString Ġ= Ġjava Class . simple Name ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġlist Ġfiles Ġin Ġgiven Ġdirectory Ġand Ġinvoke Ġcallback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlist Files ( ĊĠĠĠĠĠĠĠ Ġpath : ĠString , ĊĠĠĠĠĠĠĠ Ġroot : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġshow Hidden : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġopen Mode Callback : Ġ( open Mode : ĠOpen Mode ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġon File Found Callback : Ġ( file : ĠHy brid File Parcelable ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmode : ĠOpen Mode ĊĠĠĠĠĠĠĠ Ġif Ġ( root Ġ&& Ġ! path . startsWith ("/ storage ") Ġ&& Ġ! path . startsWith ("/ sd card ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe 're Ġroot ed Ġand Ġwe 're Ġtrying Ġto Ġload Ġfile Ġwith Ġsuper user ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe 're Ġat Ġthe Ġroot Ġdirectories , Ġsuper user Ġis Ġrequired ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġexecute Root Command ( path , Ġshow Hidden ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . first . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . contains (" Permission Ġdenied ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse String For Hybrid File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , Ġpath , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! result . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let ( on File Found Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= ĠOpen Mode . ROOT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Mode Callback ( mode ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( FileUtils . can List Files ( File ( path ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe 're Ġtaking Ġa Ġchance Ġto Ġload Ġfiles Ġusing Ġbasic Ġjava Ġfilesystem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Files List ( path , Ġshow Hidden , Ġon File Found Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= ĠOpen Mode . FILE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġcouldn 't Ġload Ġfiles Ġusing Ġnative Ġjava Ġfilesystem Ġcallbacks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmaybe Ġthe Ġaccess Ġis Ġnot Ġallowed Ġdue Ġto Ġandroid Ġsystem Ġrestrictions , Ġwe 'll Ġsee Ġlater ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= ĠOpen Mode . FILE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġopen Mode Callback ( mode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġexecutes Ġlist Ġfiles Ġroot Ġcommand Ġdirectory Ġand Ġreturn Ġeach Ġline Ġitem ĊĠĠĠĠ Ġ* Ġreturns Ġpair Ġwith Ġfirst Ġden oting Ġthe Ġresult Ġarray Ġand Ġsecond Ġif Ġrun Ġwith Ġls Ġ( true ) Ġor Ġstat Ġ( false ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Shell Not Running Exception :: class ) ĊĠĠĠ Ġfun Ġexecute Root Command ( ĊĠĠĠĠĠĠĠ Ġpath : ĠString , ĊĠĠĠĠĠĠĠ Ġshow Hidden : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġretry With Ls : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ): ĠPair < List < String >, ĠBoolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġpath Ġis Ġroot Ġkeep Ġcommand Ġ` stat Ġ- c Ġ* ` ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠElse Ġkeep Ġ` stat Ġ- c Ġ/ path / file /\ *` ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġappended Path Ġ= Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsanitized Path Ġ= ĠRoot Helper . get CommandLine String ( app ended Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappended Path Ġ= Ġwhen Ġ( path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/" Ġ-> Ġsanitized Path . replace ("/", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsanitized Path . plus ("/") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġ" stat Ġ- c Ġ'% A Ġ% h Ġ% G Ġ% U Ġ% B Ġ% y Ġ% N ' Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ app ended Path *" Ġ+ Ġ( if Ġ( show Hidden ) Ġ" Ġ$ app ended Path .* Ġ" Ġelse Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! retry With Ls Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! Preference Manager . getDefault SharedPreferences ( AppConfig . getInstance ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getBoolean ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPreferences Constants . PREFER ENCE _ ROOT _ LEG ACY _ LIST ING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( java Class . simple Name , Ġ" Using Ġstat Ġfor Ġlist Ġparsing ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġrun Shell Command ToList ( command ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . replace ( app ended Path , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Ġ= Ġretry With Ls ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( java Class . simple Name , Ġ" Using Ġls Ġfor Ġlist Ġparsing ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġrun Shell Command ToList ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ls Ġ- l Ġ" Ġ+ Ġ( if Ġ( show Hidden ) Ġ"- a Ġ" Ġelse Ġ"") Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\" $ sanit ized Path \"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Ġ= Ġretry With Ls ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( invalid Command : ĠShell Command Invalid Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( java Class . simple Name , Ġ" Command Ġnot Ġfound Ġ- Ġ${ invalid Command . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( retry With Ls ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( first Ġ= ĠArrayList (), Ġsecond Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Root Command ( path , Ġshow Hidden , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠShell Not Running Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( first Ġ= ĠArrayList (), Ġsecond Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Directory ( path : ĠHy brid File Parcelable ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpath . permission . startsWith (" d ") Ġ|| ĠFile ( path . path ). isDirectory ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoads Ġfiles Ġin Ġa Ġpath Ġusing Ġbasic Ġfilesystem Ġcallbacks ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpath Ġthe Ġpath ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Files List ( ĊĠĠĠĠĠĠĠ Ġpath : ĠString , ĊĠĠĠĠĠĠĠ Ġshow Hidden : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġlistener : Ġ( Hybrid File Parcelable ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠArrayList < Hybrid File Parcelable > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath File Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= ĠArrayList < Hybrid File Parcelable >() ĊĠĠĠĠĠĠĠ Ġif Ġ( path File . exists () Ġ&& Ġpath File . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles In Path File Ġ= Ġpath File . list Files () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( files In Path File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles In Path File . forEach Ġ{ Ġcurrent File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsize : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! current File . isDirectory ) Ġsize Ġ= Ġcurrent File . length () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHy brid File Parcelable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent File . path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoot Helper . parse File Permission ( current File ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent File . lastModified (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent File . isDirectory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). let Ġ{ Ġbase File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase File . name Ġ= Ġcurrent File . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase File . mode Ġ= ĠOpen Mode . FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Hidden ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . add ( base File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ( base File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! current File . is Hidden ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . add ( base File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ( base File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġlisting Ġfiles Ġat Ġ[$ path ]. ĠAccess Ġpermission Ġdenied ?") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Config . getInstance (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Config . toast ( this , Ġthis . getString ( R . string . error _ permission _ den ied )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfiles ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParses Ġlisting Ġcommand Ġresult Ġfor ĠHy brid File ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġparse String For Hybrid File ( ĊĠĠĠĠĠĠĠ Ġraw File : ĠString , ĊĠĠĠĠĠĠĠ Ġpath : ĠString , ĊĠĠĠĠĠĠĠ Ġis Stat : ĠBoolean ĊĠĠĠ Ġ): ĠHy brid File Parcelable ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFileUtils . parse Name ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Stat ) Ġraw File . replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ('| `) ". to Regex (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġraw File ĊĠĠĠĠĠĠĠ Ġ) ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . mode Ġ= ĠOpen Mode . ROOT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . name Ġ= Ġthis . path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path Ġ!= Ġ"/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . path Ġ= Ġpath Ġ+ Ġ"/" Ġ+ Ġthis . path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġroot Ġof Ġfilesystem , Ġdon 't Ġconcat Ġanother Ġ'/' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . path Ġ= Ġpath Ġ+ Ġthis . path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . link . trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ}. isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Stat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Directory ( this ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . isDirectory Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstat Ġcommand Ġsymlink Ġincludes Ġtime Ġstamp Ġat Ġthe Ġend ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġalso , Ġstat Ġfollows Ġsymlink Ġby Ġdefault Ġif Ġlisting Ġis Ġinvoked Ġon Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġso Ġwe Ġdon 't Ġneed Ġlink Ġfor Ġstat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . link Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoot Helper . isDirectory ( this . link , Ġ 0 ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . isDirectory Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . isDirectory Ġ= Ġis Directory ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ