File input/output: Difference between revisions

→‎[[Toka]]: Changed to work with Toka R1; main example now more readable
(Explain atomically:)
(→‎[[Toka]]: Changed to work with Toka R1; main example now more readable)
Line 784:
This is one method, which works with any type of file:
 
( source dest -- )
{
variablevalue| source dest size buffer |
{
[ "W" file.open dest !
{
"R" file.open source !
[ "W" file.open to dest ] is open-filesdest
[ source @ dest[ @"R" andfile.open 0to <>source ] is checkopen-source
[ source @ file.size[ sizeopen-dest !open-source ]
} sizeis @ malloc buffer !open-files
] is get-size{
[ source @ buffer[ @ size @source file.readsize dropto size ] is readobtain-sourcesize
[ dest @ buffer @[ size @malloc file.writeto dropbuffer ] is writeallocate-destbuffer
[ obtain-size allocate-buffer ]
[ source @ dup 0 <> [ file.close 0 ] ifTrue drop
} is create-buffer
dest @ dup 0 <> [ file.close 0 ] ifTrue drop
[ source dest and 0 <> ] is close-filescheck
[ open-files check [ getcreate-sizebuffer read-source write-dest close-files ] ifTruecheck ]
} is copy-fileprepare
[ source buffer size file.read drop ] is read-source
[ dest buffer size file.write drop ] is write-dest
[ source @file.close dup 0 <> [dest file.close 0 ] ifTrueis dropclose-files
[ prepare [ read-source write-dest close-files ] ifTrue ]
} is copy-file
 
And a much simpler way for plain text files, making use of file.slurp:
Line 806 ⟶ 811:
[ ( source dest -- )
swap file.slurp dup 0 <>
[ >r "W" file.open dup r> count 1-string.getLength file.write drop file.close ] ifTrue
] is copy-file
 
Anonymous user