/* Ċ Ġ* ĠFX GL Ġ- ĠJava FX ĠGame ĠLibrary . ĠThe ĠMIT ĠLicense Ġ( MIT ). Ċ Ġ* ĠCopyright Ġ( c ) ĠAl mas B Ġ( al mas lvl @ gmail . com ). Ċ Ġ* ĠSee ĠLICENSE Ġfor Ġdetails . Ċ Ġ*/ Ċ Ċ package Ġcom . al mas b . fx gl . io Ċ Ċ import Ġcom . al mas b . fx gl . core . concurrent . I OT ask Ċ import Ġcom . al mas b . fx gl . core . logging . Logger Ċ import Ġjava . io .* Ċ import Ġjava . nio . file .* Ċ import Ġjava . nio . file . attribute . Basic File Attributes Ċ import Ġjava . util . stream . Collectors Ċ Ċ /** Ċ Ġ* ĠA Ġcollection Ġof Ġstatic Ġmethods Ġto Ġaccess ĠIO Ġvia ĠIO Ġtasks . Ċ Ġ* Ċ Ġ* Ġ@ author ĠAl mas ĠB aim ag amb et ov Ġ( al mas lvl @ gmail . com ) Ċ Ġ*/ Ċ class ĠFS Ċ private Ġconstructor () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLogger . get ( FS :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġerror If Absent ( path : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Files . exists ( path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException (" Path Ġ$ path Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠWrites Ġdata Ġto Ġfile , Ġcreating Ġrequired Ġdirectories . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdata Ġdata Ġobject Ġto Ġsave ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param ĠfileName Ġto Ġsave Ġas ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠIO Ġtask ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġfun Ġwrite Data Task ( data : ĠSerializable , ĠfileName : ĠString ) Ġ= ĠI OT ask . of Void (" write Data Task ($ fileName )", Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠPaths . get ( fileName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġfile . parent Ġis Ġnull Ġwe Ġwill Ġuse Ġcurrent Ġdir , Ġwhich Ġexists ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . parent Ġ!= Ġnull Ġ&& Ġ! Files . exists ( file . parent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Creating Ġdirectories Ġto : Ġ${ file . parent }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . create Directories ( file . parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠObject OutputStream ( Files . new OutputStream ( file )). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Writing Ġto : Ġ$ file ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . write Object ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLoads Ġdata Ġfrom Ġfile Ġinto Ġan Ġobject . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param ĠfileName Ġfile Ġto Ġload Ġfrom ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠIO Ġtask ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġfun Ġ< T > Ġread Data Task ( fileName : ĠString ) Ġ= ĠI OT ask . of (" read Data Task ($ fileName )") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠPaths . get ( fileName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror If Absent ( file ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠObject InputStream ( Files . new InputStream ( file )). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Reading Ġfrom : Ġ$ file ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ of Ġit . read Object () Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLoads Ġfile Ġnames Ġfrom Ġgiven Ġdirectory . ĊĠĠĠĠĠĠĠĠ Ġ* ĠS ear ches Ġsub directories Ġif Ġrecursive Ġflag Ġis Ġon . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdir Name Ġdirectory Ġname ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrecursive Ġrecursive Ġflag ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠIO Ġtask ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġfun Ġload File Names Task ( dir Name : ĠString , Ġrecursive : ĠBoolean ) Ġ= ĠI OT ask . of (" load File Names Task ($ dir Name , Ġ$ recursive )") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠPaths . get ( dir Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror If Absent ( dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ of ĠFiles . walk ( dir , Ġif Ġ( recursive ) ĠInt . MAX _ VALUE Ġelse Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠFiles . is Regular File ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġdir . rel ativ ize ( it ). toString (). replace ("\\ ", Ġ"/") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( Collectors . toList < String >()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLoads Ġfile Ġnames Ġfrom Ġgiven Ġdirectory . ĊĠĠĠĠĠĠĠĠ Ġ* ĠS ear ches Ġsub directories Ġif Ġrecursive Ġflag Ġis Ġon . ĊĠĠĠĠĠĠĠĠ Ġ* ĠOnly Ġnames Ġfrom Ġextensions Ġlist Ġwill Ġbe Ġreported . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdir Name Ġdirectory Ġname ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrecursive Ġrecursive Ġflag ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġextensions Ġfile Ġextensions Ġto Ġinclude ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠIO Ġtask ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġfun Ġload File Names Task ( dir Name : ĠString , Ġrecursive : ĠBoolean , Ġextensions : ĠList < File Extension >) Ġ= ĠI OT ask . of (" load File Names Task ($ dir Name , Ġ$ recursive , Ġ$ extensions )") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠPaths . get ( dir Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror If Absent ( dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ of ĠFiles . walk ( dir , Ġif Ġ( recursive ) ĠInt . MAX _ VALUE Ġelse Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġfile Ġ-> ĠFiles . is Regular File ( file ) Ġ&& Ġextensions . filter Ġ{ Ġ"$ file ". endsWith ( it . extension ) Ġ}. isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġdir . rel ativ ize ( it ). toString (). replace ("\\ ", Ġ"/") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( Collectors . toList < String >()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLoads Ġdirectory Ġnames Ġfrom Ġ[ dir Name ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĠS ear ches Ġsub directories Ġif Ġ[ recursive ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdir Name Ġdirectory Ġname ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrecursive Ġrecursive Ġflag ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠIO Ġtask ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġfun Ġload Directory Names Task ( dir Name : ĠString , Ġrecursive : ĠBoolean ) Ġ= ĠI OT ask . of (" load Directory Names Task ($ dir Name , Ġ$ recursive )", Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠPaths . get ( dir Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror If Absent ( dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ of ĠFiles . walk ( dir , Ġif Ġ( recursive ) ĠInt . MAX _ VALUE Ġelse Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠFiles . isDirectory ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġdir . rel ativ ize ( it ). toString (). replace ("\\ ", Ġ"/") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( Collectors . toList < String >()) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLoads Ġ( de serial izes ) Ġlast Ġmodified Ġfile Ġfrom Ġgiven Ġ[ dir Name ] Ġdirectory . ĊĠĠĠĠĠĠĠĠ Ġ* ĠS ear ches Ġsub directories Ġif Ġ[ recursive ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdir Name Ġdirectory Ġname ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrecursive Ġrecursive Ġflag ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠIO Ġtask ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġfun Ġ< T > Ġload LastModified File Task ( dir Name : ĠString , Ġrecursive : ĠBoolean ) Ġ= ĠI OT ask . of (" load LastModified File Task ($ dir Name , Ġ$ recursive )") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠPaths . get ( dir Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror If Absent ( dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ of ĠFiles . walk ( dir , Ġif Ġ( recursive ) ĠInt . MAX _ VALUE Ġelse Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠFiles . is Regular File ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted Ġ{ Ġfile 1 , Ġfile 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . getLast Modified Time ( file 2 ). compareTo ( Files . getLast Modified Time ( file 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findFirst () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġdir . rel ativ ize ( it ). toString (). replace ("\\ ", Ġ"/") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse Throw Ġ{ ĠFileNotFoundException (" No Ġfiles Ġfound Ġin Ġ$ dir ") Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}. then Ġ{ ĠfileName Ġ-> Ġread Data Task < T >( dir Name Ġ+ ĠfileName ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDelete Ġfile Ġ[ fileName ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param ĠfileName Ġname Ġof Ġfile Ġto Ġdelete ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠIO Ġtask ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġfun Ġdelete File Task ( fileName : ĠString ) Ġ= ĠI OT ask . of Void (" delete File Task ($ fileName )") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠPaths . get ( fileName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror If Absent ( file ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Deleting Ġfile : Ġ$ file ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . delete ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDelete Ġdirectory Ġ[ dir Name ] Ġand Ġits Ġcontents . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdir Name Ġdirectory Ġname Ġto Ġdelete ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠIO Ġtask ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġfun Ġdelete Directory Task ( dir Name : ĠString ) Ġ= ĠI OT ask . of Void (" delete Directory Task ($ dir Name )") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠPaths . get ( dir Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror If Absent ( dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . walk File Tree ( dir , Ġobject Ġ: ĠSimple File Visitor < Path >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit File ( file : ĠPath , Ġp 1 : ĠBasic File Attributes ): ĠFile Visit Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Deleting Ġfile : Ġ$ file ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . delete ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile Visit Result . CONTINUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpost Visit Directory ( directory : ĠPath , Ġe : ĠIOException ?): ĠFile Visit Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Deleting Ġdirectory : Ġ$ directory ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . delete ( directory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile Visit Result . CONTINUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }