A File instance represents a file entry in the local file system and allows using it as an IO.
file = File.new("path/to/file")
content = file.gets_to_end
file.close
# Implicit close with `open` and a block:
content = File.open("path/to/file") do |file|
file.gets_to_end
end
# Shortcut of the above:
content = File.read("path/to/file")
# Write to a file by opening with a "write mode" specified.
File.open("path/to/file", "w") do |file|
file.print "hello"
end
# Content of file on disk will now be "hello".
# Shortcut of the above:
File.write("path/to/file", "hello") See .new for various options mode can be.
Every tempfile is operated as a File, including initializing, reading and writing.
tempfile = File.tempfile("foo")
File.size(tempfile.path) # => 6
File.info(tempfile.path).modification_time # => 2015-10-20 13:11:12Z
File.exists?(tempfile.path) # => true
File.read_lines(tempfile.path) # => ["foobar"] Files created from .tempfile are stored in a directory that handles temporary files (Dir.tempdir):
File.tempfile("foo").path # => "/tmp/foo.ulBCPS" It is encouraged to delete a tempfile after using it, which ensures they are not left behind in your filesystem until garbage collected.
tempfile = File.tempfile("foo")
tempfile.delete {% if flag?(:win32) %}
"NUL"
{% else %}
"/dev/null"
{% end %} The name of the null device on the host platform. /dev/null on UNIX and NUL on win32.
When this device is opened using File.open, read operations will always return EOF, and any data written will be immediately discarded.
File.open(File::NULL, "w") do |file| file.puts "this is discarded" end
'/' The file/directory separator character. '/' on all platforms.
"/" The file/directory separator string. "/" on all platforms.
Opens the file named by filename.
DEPRECATED parameter blocking
Opens the file named by filename.
DEPRECATED parameter blocking
Returns the last component of the given path.
Returns the last component of the given path.
Changes the permissions of the specified file.
Changes the owner of the specified file.
Copies the file src to the file dst.
Deletes the file at path.
Deletes the file at path, or returns false if the file does not exist.
Returns true if the given path exists and is a directory.
Returns all components of the given path except the last one.
Yields each line in filename to the given block.
DEPRECATED parameter blocking
Returns true if the file at path is empty, otherwise returns false.
Returns true if path is executable by the real user id of this process else returns false.
DEPRECATED Use File::Info.executable? instead
Returns whether the file given by path exists.
Converts path to an absolute path.
Returns filename's extension, or an empty string if it has no extension.
Returns true if given path exists and is a file.
Returns a File::Info object for the file given by path or raises File::Error in case of an error.
Returns a File::Info object for the file given by path or returns nil if the file does not exist.
Returns a new string formed by joining the strings using File::SEPARATOR.
Returns a new string formed by joining the strings using File::SEPARATOR.
Creates a new link (also known as a hard link) at new_path to an existing file given by old_path.
Matches path against pattern.
Opens the file named by filename.
DEPRECATED parameter blocking
Returns the content of filename as a string.
DEPRECATED parameter blocking
Returns all lines in filename as an array of strings.
DEPRECATED parameter blocking
Returns true if path is readable by the real user id of this process else returns false.
DEPRECATED Use File::Info.readable? instead
Returns the target of a symbolic link.
Returns the target of a symbolic link.
Resolves the real path of path by following symbolic links.
DEPRECATED Use .realpath instead.
Resolves the real path of path by following symbolic links.
Moves old_filename to new_filename.
Returns true if path1 and path2 represents the same file.
Compares two files filename1 to filename2 to determine if they are identical.
Returns the size of the file at filename in bytes.
Creates a symbolic link at new_path to an existing file given by old_path.
Returns true if the path is a symbolic link.
Creates a temporary file.
Creates a temporary file.
Creates a temporary file and yields it to the given block.
Creates a temporary file and yields it to the given block.
Returns a fully-qualified path to a temporary file.
Returns a fully-qualified path to a temporary file.
Attempts to set the access and modification times of the file named in the filename parameter to the value given in time.
Sets the access and modification times of filename.
Returns true if path is writable by the real user id of this process else returns false.
DEPRECATED Use File::Info.writable? instead
Writes the given content to filename.
DEPRECATED parameter blocking
Changes the permissions of the specified file.
Changes the owner of the specified file.
Deletes this file.
Appends a String representation of this object which includes its class name, its object address and the values of all instance variables.
Yields an IO to read a section inside this file.
Rename the current File
Returns the size in bytes of the currently opened file.
Attempts to set the access and modification times to the value given in time.
Truncates the file to the specified size.
Sets the access and modification times
Crystal::System::File
IO::FileDescriptor
IO::FileDescriptor
IO::FileDescriptor
IO::FileDescriptor
IO::Buffered
Crystal::System::FileDescriptor
Crystal::System::FileDescriptor
IO
IO
Reference
Reference
Reference
Object
Object
Object
Opens the file named by filename.
mode must be one of the following file open modes:
Mode | Description
-----------+------------------------------------------------------
r rb | Read-only, starts at the beginning of the file.
r+ r+b rb+ | Read-write, starts at the beginning of the file.
w wb | Write-only, truncates existing file to zero length or
| creates a new file if the file doesn't exist.
w+ w+b wb+ | Read-write, truncates existing file to zero length or
| creates a new file if the file doesn't exist.
a ab | Write-only, all writes seek to the end of the file,
| creates a new file if the file doesn't exist.
a+ a+b ab+ | Read-write, all writes seek to the end of the file,
| creates a new file if the file doesn't exist. Line endings are preserved on all platforms. The b mode flag has no effect; it is provided only for POSIX compatibility.
NOTE The blocking arg is deprecated since Crystal 1.17. It used to be true by default to denote a regular disk file (always ready in system event loops) and could be set to false when the file was known to be a fifo, pipe, or character device (for example /dev/tty). The event loop now chooses the appropriate blocking mode automatically and there are no reasons to change it anymore.
NOTE On macOS files are always opened in blocking mode because non-blocking FIFO files don't work — the OS exhibits issues with readiness notifications.
DEPRECATED parameter blocking
Opens the file named by filename. If a file is being created, its initial permissions may be set using the perm parameter.
See self.new for what mode can be.
DEPRECATED parameter blocking
Returns the last component of the given path.
If suffix is present at the end of path, it is removed.
File.basename("/foo/bar/file.cr", ".cr") # => "file" Returns the last component of the given path.
File.basename("/foo/bar/file.cr") # => "file.cr" Changes the permissions of the specified file.
Symlinks are dereferenced, so that only the permissions of the symlink destination are changed, never the permissions of the symlink itself.
File.chmod("foo", 0o755)
File.info("foo").permissions.value # => 0o755
File.chmod("foo", 0o700)
File.info("foo").permissions.value # => 0o700 Changes the owner of the specified file.
File.chown("/foo/bar/baz.cr", 1001, 100)
File.chown("/foo/bar", gid: 100) Unless follow_symlinks is set to true, then the owner symlink itself will be changed, otherwise the owner of the symlink destination file will be changed. For example, assuming symlinks as foo -> bar -> baz:
File.chown("foo", gid: 100) # changes foo's gid
File.chown("foo", gid: 100, follow_symlinks: true) # changes baz's gid Copies the file src to the file dst. Permission bits are copied too.
File.touch("afile")
File.chmod("afile", 0o600)
File.copy("afile", "afile_copy")
File.info("afile_copy").permissions.value # => 0o600 Deletes the file at path. Raises File::Error on failure.
On Windows, this also deletes reparse points, including symbolic links, regardless of whether the reparse point is a directory.
File.write("foo", "")
File.delete("./foo")
File.delete("./bar") # raises File::NotFoundError (No such file or directory) Deletes the file at path, or returns false if the file does not exist. Raises File::Error on other kinds of failure.
On Windows, this also deletes reparse points, including symbolic links, regardless of whether the reparse point is a directory.
File.write("foo", "")
File.delete?("./foo") # => true
File.delete?("./bar") # => false Returns true if the given path exists and is a directory.
File.write("foo", "")
Dir.mkdir("dir2")
File.directory?("foo") # => false
File.directory?("dir2") # => true
File.directory?("foobar") # => false Returns all components of the given path except the last one.
File.dirname("/foo/bar/file.cr") # => "/foo/bar" Yields each line in filename to the given block.
File.write("foobar", "foo\nbar")
array = [] of String
File.each_line("foobar") do |line|
array << line
end
array # => ["foo", "bar"] DEPRECATED parameter blocking
Returns true if the file at path is empty, otherwise returns false. Raises File::NotFoundError if the file at path does not exist.
File.write("foo", "")
File.empty?("foo") # => true
File.write("foo", "foo")
File.empty?("foo") # => false Returns true if path is executable by the real user id of this process else returns false.
File.write("foo", "foo")
File.executable?("foo") # => false DEPRECATED Use File::Info.executable? instead
Returns whether the file given by path exists.
Symbolic links are dereferenced, possibly recursively. Returns false if a symbolic link refers to a non-existent file.
File.delete("foo") if File.exists?("foo")
File.exists?("foo") # => false
File.write("foo", "foo")
File.exists?("foo") # => true Converts path to an absolute path. Relative paths are referenced from the current working directory of the process unless dir is given, in which case it will be used as the starting point. "~" is expanded to the value passed to home. If it is false (default), home is not expanded. If true, it is expanded to the user's home directory (Path.home).
File.expand_path("foo") # => "/home/.../foo"
File.expand_path("~/foo", home: "/bar") # => "/bar/foo"
File.expand_path("baz", "/foo/bar") # => "/foo/bar/baz" Returns filename's extension, or an empty string if it has no extension.
File.extname("foo.cr") # => ".cr" Returns true if given path exists and is a file.
File.write("foo", "")
Dir.mkdir("dir1")
File.file?("foo") # => true
File.file?("dir1") # => false
File.file?("foobar") # => false Returns a File::Info object for the file given by path or raises File::Error in case of an error.
If follow_symlinks is set (the default), symbolic links are followed. Otherwise, symbolic links return information on the symlink itself.
File.write("foo", "foo")
File.info("foo").size # => 3
File.info("foo").modification_time # => 2015-09-23 06:24:19Z
File.symlink("foo", "bar")
File.info("bar", follow_symlinks: false).type.symlink? # => true Use IO::FileDescriptor#info if the file is already open.
Returns a File::Info object for the file given by path or returns nil if the file does not exist.
If follow_symlinks is set (the default), symbolic links are followed. Otherwise, symbolic links return information on the symlink itself.
File.write("foo", "foo")
File.info?("foo").try(&.size) # => 3
File.info?("non_existent") # => nil
File.symlink("foo", "bar")
File.info?("bar", follow_symlinks: false).try(&.type.symlink?) # => true Use IO::FileDescriptor#info if the file is already open.
Returns a new string formed by joining the strings using File::SEPARATOR.
File.join({"foo", "bar", "baz"}) # => "foo/bar/baz"
File.join({"foo/", "/bar/", "/baz"}) # => "foo/bar/baz"
File.join(["/foo/", "/bar/", "/baz/"]) # => "/foo/bar/baz/" Returns a new string formed by joining the strings using File::SEPARATOR.
File.join("foo", "bar", "baz") # => "foo/bar/baz"
File.join("foo/", "/bar/", "/baz") # => "foo/bar/baz"
File.join("/foo/", "/bar/", "/baz/") # => "/foo/bar/baz/" Creates a new link (also known as a hard link) at new_path to an existing file given by old_path.
Matches path against pattern.
The pattern syntax is similar to shell filename globbing. It may contain the following metacharacters:
*: Wildcard matches zero or more characters, except for directory separators.**: Globstar matches zero or more characters, including directory separators. It must match a complete path segment, i.e. it must be wrapped in / except for the beginning and end of the pattern.?: Matches a single Unicode character, except for directory separators.[abc]: Character set matches one of the Unicode characters contained in the brackets.[^abc]: Negated character set matches any Unicode character except those contained in the brackets.[a-z]: Character range matches one Unicode character contained in the character range.[^a-z]: Negated character range matches one Unicode character except those contained in the character range.{a,b}: Branches matches one of the subpatterns contained in the braces. Subpatterns may contain any other pattern feature, including nested branches (max nesting depth is 10 levels deep).\\: Backslash escapes the next character.Multiple character pattern can be combined in the same brackets to define a character class (for example: [0-9a-f]).
If path is a Path, all directory separators supported by path are recognized, according to the path's kind. If path is a String, only / is considered a directory separator.
NOTE Only / in pattern matches directory separators in path.
Opens the file named by filename. If a file is being created, its initial permissions may be set using the perm parameter. Then given block will be passed the opened file as an argument, the file will be automatically closed when the block returns.
See self.new for what mode can be.
DEPRECATED parameter blocking
Returns the content of filename as a string.
Raises File::Error if the file cannot be read.
File.write("bar", "foo")
File.read("bar") # => "foo"
File.read("non-existent") # raises File::NotFoundError DEPRECATED parameter blocking
Returns all lines in filename as an array of strings.
File.write("foobar", "foo\nbar")
File.read_lines("foobar") # => ["foo", "bar"] DEPRECATED parameter blocking
Returns true if path is readable by the real user id of this process else returns false.
File.write("foo", "foo")
File.readable?("foo") # => true DEPRECATED Use File::Info.readable? instead
Returns the target of a symbolic link.
Returns nil if path does not exist or is not a symbolic link.
Resolves the real path of path by following symbolic links.
DEPRECATED Use .realpath instead.
Resolves the real path of path by following symbolic links.
Moves old_filename to new_filename.
File.write("afile", "foo")
File.exists?("afile") # => true
File.rename("afile", "afile.cr")
File.exists?("afile") # => false
File.exists?("afile.cr") # => true Returns true if path1 and path2 represents the same file. The comparison take symlinks in consideration if follow_symlinks is true.
Compares two files filename1 to filename2 to determine if they are identical. Returns true if content are the same, false otherwise.
File.write("file.cr", "1")
File.write("bar.cr", "1")
File.same_content?("file.cr", "bar.cr") # => true Returns the size of the file at filename in bytes. Raises File::NotFoundError if the file at filename does not exist.
File.size("foo") # raises File::NotFoundError
File.write("foo", "foo")
File.size("foo") # => 3 Creates a symbolic link at new_path to an existing file given by old_path.
Creates a temporary file.
tempfile = File.tempfile("foo", ".bar")
tempfile.delete prefix and suffix are appended to the front and end of the file name, respectively.
NOTE These path values may contain directory separators. It's the caller's responsibility to ensure they are used safely. For example by rejecting user-provided values that would result in navigating the directory tree.
The file will be placed in dir which defaults to the standard temporary directory Dir.tempdir.
encoding and invalid are passed to IO#set_encoding.
It is the caller's responsibility to remove the file when no longer needed.
Creates a temporary file.
tempfile = File.tempfile(".bar")
tempfile.delete prefix and suffix are appended to the front and end of the file name, respectively.
NOTE These path values may contain directory separators. It's the caller's responsibility to ensure they are used safely. For example by rejecting user-provided values that would result in navigating the directory tree.
The file will be placed in dir which defaults to the standard temporary directory Dir.tempdir.
encoding and invalid are passed to IO#set_encoding.
It is the caller's responsibility to remove the file when no longer needed.
Creates a temporary file and yields it to the given block. It is closed and returned at the end of this method call.
tempfile = File.tempfile("foo", ".bar") do |file|
file.print("bar")
end
File.read(tempfile.path) # => "bar"
tempfile.delete prefix and suffix are appended to the front and end of the file name, respectively. These values may contain directory separators.
The file will be placed in dir which defaults to the standard temporary directory Dir.tempdir.
encoding and invalid are passed to IO#set_encoding.
It is the caller's responsibility to remove the file when no longer needed.
Creates a temporary file and yields it to the given block. It is closed and returned at the end of this method call.
tempfile = File.tempfile(".bar") do |file|
file.print("bar")
end
File.read(tempfile.path) # => "bar"
tempfile.delete prefix and suffix are appended to the front and end of the file name, respectively.
NOTE These path values may contain directory separators. It's the caller's responsibility to ensure they are used safely. For example by rejecting user-provided values that would result in navigating the directory tree.
The file will be placed in dir which defaults to the standard temporary directory Dir.tempdir.
encoding and invalid are passed to IO#set_encoding.
It is the caller's responsibility to remove the file when no longer needed.
Returns a fully-qualified path to a temporary file. The file is not actually created on the file system.
File.tempname("foo", ".sock") # => "/tmp/foo20171206-1234-449386.sock" prefix and suffix are appended to the front and end of the file name, respectively.
NOTE These path values may contain directory separators. It's the caller's responsibility to ensure they are used safely. For example by rejecting user-provided values that would result in navigating the directory tree.
The path will be placed in dir which defaults to the standard temporary directory Dir.tempdir.
Returns a fully-qualified path to a temporary file. The optional suffix is appended to the file name.
File.tempname # => "/tmp/20171206-1234-449386"
File.tempname(".sock") # => "/tmp/20171206-1234-449386.sock" Returns true if path is writable by the real user id of this process else returns false.
File.write("foo", "foo")
File.writable?("foo") # => true DEPRECATED Use File::Info.writable? instead
Writes the given content to filename.
By default, an existing file will be overwritten.
filename will be created if it does not already exist.
File.write("foo", "bar")
File.write("foo", "baz", mode: "a") NOTE If the content is a Slice(UInt8), those bytes will be written. If it's an IO, all bytes from the IO will be written. Otherwise, the string representation of content will be written (the result of invoking to_s on content).
See self.new for what mode can be.
DEPRECATED parameter blocking
Changes the permissions of the specified file.
file.chmod(0o755) file.info.permissions.value # => 0o755 file.chmod(0o700) file.info.permissions.value # => 0o700
Changes the owner of the specified file.
file.chown(1001, 100) file.chown(gid: 100)
Appends a String representation of this object which includes its class name, its object address and the values of all instance variables.
class Person
def initialize(@name : String, @age : Int32)
end
end
Person.new("John", 32).inspect # => #<Person:0x10fd31f20 @name="John", @age=32> Yields an IO to read a section inside this file. Multiple sections can be read concurrently.
Attempts to set the access and modification times to the value given in time.
Truncates the file to the specified size. Requires that the current file is opened for writing.
© 2012–2026 Manas Technology Solutions.
Licensed under the Apache License, Version 2.0.
https://crystal-lang.org/api/1.19.0/File.html