^title File Class Lets you work with files on the file system. An instance of this class represents an open file with a file descriptor. When you are done with a file object, it's a good idea to explicitly close it. If you don't, the GC will close it when the file is no longer used and gets finalized, but that may take a while. In the meantime, leaving it open wastes a file descriptor. ## Static Methods ### File.**create**(path, fn) Opens the file at `path` for writing and passes it to `fn`. If there is already a file at that path, it is truncated. After the function returns, the file is automatically closed. :::wren File.create("numbers.txt") {|file| file.writeBytes("one two three") } ### File.**delete**(path) Deletes the file at `path`. ### File.**exists**(path) Whether a regular file exists at `path`. This returns `false` for directories or other special file system entities. ### File.**open**(path, fn) Opens the file at `path` for reading and passes it to `fn`. After the function returns, the file is automatically closed. :::wren File.open("words.txt") {|file| file.readBytes(5) } ### File.**read**(path) Reads the entire contents of the file at `path` and returns it as a string. :::wren File.read("words.txt") No encoding or decoding is done. If the file is UTF-8, then the resulting string will be a UTF-8 string. Otherwise, it will be a string of bytes in whatever encoding the file uses. ### File.**realPath**(path) Resolves `path`, traversing symlinks and removining any unneeded `./` and `../` components. Returns the canonical absolute path to the file. :::wren var path = "/some/./symlink/a/../b/file.txt" System.print(File.realPath(path)) //> /real/path/a/file.txt ### File.**size**(path) Returns the size in bytes of the contents of the file at `path`. ## Constructors ### File.**create**(path) Opens the file at `path` for writing. If there is already a file at that path, it is truncated. :::wren var file = File.create("colors.txt") file.writeBytes("chartreuse lime teal") file.close() ### File.**open**(path) Opens the file at `path` for reading. You are responsible for closing it when done with it. ## Methods ### **descriptor** The numeric file descriptor used to access the file. ### **isOpen** Whether the file is still open or has been closed. ### **size** The size of the contents of the file in bytes. ### **close**() Closes the file. After calling this, you can read or write from it. ### **readBytes**(count) Reads up to `count` bytes starting from the beginning of the file. :::wren // Assume this file contains "I am a file!". File.open("example.txt") {|file| System.print(file.readBytes(6)) //> I am a } ### **readBytes**(count, offset) Reads up to `count` bytes starting at `offset` bytes from the beginning of the file. :::wren // Assume this file contains "I am a file!". File.open("example.txt") {|file| System.print(file.readBytes(6, 2)) //> am a f } ### **writeBytes**(bytes) Writes the raw bytes of the string `bytes` to the end of the file. ### **writeBytes**(bytes, offset) Writes the raw bytes of the string `bytes` to the to the file, starting at `offset`. Any overlapping bytes already in the file at the offset are overwritten.