package Ġme . arch in amon . file io Ċ Ċ import Ġkotlinx . c interop .* Ċ import Ġplatform . windows .* Ċ Ċ // ĠD ifference Ġbetween ĠJanuary Ġ 1 , Ġ 1 6 0 1 Ġand ĠJanuary Ġ 1 , Ġ 1 9 7 0 Ġin Ġmillis Ċ private Ġconst Ġval ĠE POCH _ DIFF Ġ= Ġ 1 1 6 4 4 4 7 3 6 0 0 0 0 0 ĊĊ Ċ actual Ġclass ĠFile Ġactual Ġconstructor ( pathname : ĠString ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġpathname : ĠString Ġ= Ġpathname . replace ('/', ĠfilePath Separator ) ĊĊĠĠĠ Ġactual Ġfun ĠgetParent (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( exists ()) Ġget AbsolutePath (). substring Before Last ( filePath Separator ) Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun ĠgetParent File (): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠgetParent ()?. run (:: File ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun ĠgetName (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( filePath Separator Ġin Ġpathname ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpathname . split ( filePath Separator ). last ( String :: isNotBlank ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpathname ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġlast Modified (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandle Ġ= ĠCreateFile A ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpathname , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGENER IC _ READ , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOPEN _ EXIST ING , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFILE _ ATTRIBUTE _ NORMAL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( handle Ġ== ĠINVALID _ HANDLE _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 L ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġft Ġ= Ġalloc <_ FILE TIME >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠGet File Time ( handle , Ġnull , Ġnull , Ġft . ptr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== ĠTRUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst Ġ= Ġalloc <_ SYSTEM TIME >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconvert Result Ġ= ĠFile TimeTo System Time ( ft . ptr , Ġst . ptr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( convert Result Ġ== ĠTRUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġ( ft . dw High DateTime . to Long () Ġshl Ġ 3 2 ) Ġor Ġft . dw Low DateTime . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( time Ġ/ Ġ 1 0 0 0 0 ) Ġ- ĠE POCH _ DIFF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClose Handle ( handle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġmkdir s (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( exists ()) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( getParent File ()?. exists () Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetParent File ()?. mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSH Create Directory Ex A ( null , Ġget AbsolutePath (), Ġnull ) Ġ== ĠERROR _ SUCCESS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġcreate New File (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandle Ġ= ĠCreateFile A ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpathname , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGENER IC _ WRITE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFILE _ SHARE _ READ , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCREATE _ NEW , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFILE _ ATTRIBUTE _ NORMAL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Ġ!= ĠINVALID _ HANDLE _ VALUE ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClose Handle ( handle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġis File (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGet File Attributes A ( pathname ). let Ġ{ Ġattrs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs Ġ!= ĠINVALID _ FILE _ ATTRIBUTES Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs Ġand ĠFILE _ ATTRIBUTE _ DIRECTORY . to UInt () Ġ== Ġ 0 u ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġis Directory (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGet File Attributes A ( pathname ). let Ġ{ Ġattrs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs Ġ!= ĠINVALID _ FILE _ ATTRIBUTES Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( attrs Ġand ĠFILE _ ATTRIBUTE _ DIRECTORY . to UInt () Ġ!= Ġ 0 u ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġget AbsolutePath (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( pathname . startsWith ( filePath Separator ) Ġ|| Ġpathname . get OrNull ( 1 ) Ġ== Ġ': ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpathname ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuf Length Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= Ġalloc Array < Byte Var >( buf Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠGetCurrent Directory A ( buf Length . to UInt (), Ġbuf ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( result Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ> Ġbuf Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġretry Buf Ġ= Ġalloc Array < Byte Var >( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGetCurrent Directory A ( result . to UInt (), Ġbuf ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( result Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry Buf . to K String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . to K String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ+ ĠfilePath Separator Ġ+ Ġpathname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġexists (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGet File Attributes A ( pathname ) Ġ!= ĠINVALID _ FILE _ ATTRIBUTES ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġcan Read (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandle Ġ= ĠCreateFile A ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpathname , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGENER IC _ READ , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFILE _ SHARE _ READ , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOPEN _ EXIST ING , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Ġ!= ĠINVALID _ HANDLE _ VALUE ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClose Handle ( handle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġcan Write (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandle Ġ= ĠCreateFile A ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpathname , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGENER IC _ WRITE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFILE _ SHARE _ WRITE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOPEN _ EXIST ING , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Ġ!= ĠINVALID _ HANDLE _ VALUE ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClose Handle ( handle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġlist (): ĠArray < String > Ġ= Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isFile ()) Ġreturn Ġempty Array () ĊĊĠĠĠĠĠĠĠ Ġval Ġfind Data Ġ= Ġalloc < WIN 3 2 _ FIND _ DAT AA >() ĊĠĠĠĠĠĠĠ Ġval Ġsearch Path Ġ= Ġif Ġ( pathname . endsWith ( filePath Separator )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpathname ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ pathname ${ filePath Separator }" ĊĠĠĠĠĠĠĠ Ġ} Ġ+ Ġ"*" ĊĠĠĠĠĠĠĠ Ġval Ġfind Ġ= ĠFind First File A ( search Path , Ġfind Data . ptr ) ĊĠĠĠĠĠĠĠ Ġif Ġ( find Ġ== ĠINVALID _ HANDLE _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty Array () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( Find Next File A ( find , Ġfind Data . ptr ) Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġfind Data . c FileName . to K String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fileName Ġ!= Ġ".. ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . add ( fileName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFind Close ( find ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfiles . to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġlist Files (): ĠArray < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isFile ()) Ġreturn Ġempty Array () ĊĠĠĠĠĠĠĠ Ġval Ġthis Path Ġ= Ġget AbsolutePath (). let Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! path . endsWith ( filePath Separator )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ+ ĠfilePath Separator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġpath ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġname Ġ-> ĠFile ( this Path Ġ+ Ġname ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġdelete (): ĠBoolean Ġ= Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isFile ()) Ġreturn ĠDelete File A ( pathname ) Ġ== ĠTRUE ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Op Ġ= Ġalloc < SH FILE OP STRUCT A > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhwnd Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġw Func Ġ= ĠFO _ DELETE . to UInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp From Ġ= Ġpathname . cstr . ptr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp To Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Flags Ġ= Ġ( FO F _ SIL ENT Ġor ĠF OF _ NO CONFIRM ATION Ġor ĠF OF _ NO ERROR UI ). to U Short () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Any Operations Abort ed Ġ= ĠFALSE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh Name Mappings Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlpsz Progress Title Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSH File Operation A ( file Op . ptr ) Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġwrite Bytes ( bytes : ĠByteArray , Ġaccess : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandle Ġ= ĠCreateFile A ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget AbsolutePath (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccess . to UInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFILE _ SHARE _ WRITE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOPEN _ EXIST ING , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( handle Ġ== ĠINVALID _ HANDLE _ VALUE ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Written Ġ= Ġalloc < UInt Var >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes . use Pin ned Ġ{ Ġb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWrite File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . address Of ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes . size . to UInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes Written . ptr , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClose Handle ( handle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" File Ġ{\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" path =${ getAbsolutePath () }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" name =${ getName () }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" exists =${ exists () }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" can Read =${ can Read () }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" can Write =${ can Write () }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" isFile =${ isFile () }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" isDirectory =${ isDirectory () }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" lastModified =${ lastModified () }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( isDirectory ()) Ġ" files =[ ${ list Files (). join ToString ()} ]" Ġelse Ġ"") Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" }" ĊĠĠĠ Ġ} Ċ } Ċ Ċ actual Ġval ĠfilePath Separator Ġby Ġlazy Ġ{ Ġif Ġ( Platform . os Family Ġ== ĠOs Family . WINDOWS ) Ġ'\\ ' Ġelse Ġ'/' Ġ} Ċ Ċ actual Ġval ĠFile . mime Type : ĠString ĊĠĠĠ Ġget () Ġ= Ġ"" Ċ Ċ actual Ġfun ĠFile . read Bytes (): ĠByteArray Ġ= Ġmem Scoped Ġ{ ĊĠĠĠ Ġval Ġhandle Ġ= ĠCreateFile A ( ĊĠĠĠĠĠĠĠ Ġget AbsolutePath (), ĊĠĠĠĠĠĠĠ ĠGENER IC _ READ , ĊĠĠĠĠĠĠĠ ĠFILE _ SHARE _ READ , ĊĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠ ĠOPEN _ EXIST ING , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ) ĊĠĠĠ Ġif Ġ( handle Ġ== ĠINVALID _ HANDLE _ VALUE ) Ġreturn Ġbyte ArrayOf () ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfs Ġ= Ġalloc <_ LARGE _ INTEGER >() ĊĠĠĠĠĠĠĠ Ġif Ġ( Get FileSize Ex ( handle , Ġfs . ptr ) Ġ== ĠTRUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġ( fs . High Part . to UInt () Ġshl Ġ 3 2 ) Ġor Ġfs . Low Part ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= Ġalloc Array < Byte Var >( size . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Read Ġ= Ġalloc < UInt Var >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ReadFile ( handle , Ġbuf , Ġsize , Ġbytes Read . ptr , Ġnull ) Ġ== ĠTRUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . read Bytes ( bytes Read . value . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte ArrayOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte ArrayOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ ĠClose Handle ( handle ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ actual Ġfun ĠFile . write Bytes ( bytes : ĠByteArray ) Ġ{ ĊĠĠĠ Ġ// Ġno Ġneed Ġto Ġuse Ġpin ning Ġor Ġme ms cope , Ġcause Ġit 's Ġinside Ġthe Ġmethod Ġalready Ġdoes ĊĠĠĠ Ġwrite Bytes ( bytes , ĠGENER IC _ WRITE ) Ċ } Ċ Ċ actual Ġfun ĠFile . read Text (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġread Bytes (). to K String () Ċ } Ċ Ċ actual Ġfun ĠFile . append Text ( text : ĠString ) Ġ{ ĊĠĠĠ Ġwrite Bytes ( text . encode To ByteArray (), ĠFILE _ APPEND _ DATA ) Ċ } Ċ Ċ actual Ġfun ĠFile . write Text ( text : ĠString ) Ġ{ ĊĠĠĠ Ġwrite Bytes ( text . encode To ByteArray (), ĠGENER IC _ WRITE ) Ċ } ĊĊ