Elixir v1.0.4 File
This module contains functions to manipulate files.
Some of those functions are low-level, allowing the user
to interact with the file or IO devices, like open/2,
copy/3 and others. This module also provides higher
level functions that work with filenames and have their naming
based on UNIX variants. For example, one can copy a file
via cp/3 and remove files and directories recursively
via rm_rf/1
Encoding
In order to write and read files, one must use the functions
in the IO module. By default, a file is opened in binary mode
which requires the functions IO.binread/2 and IO.binwrite/2
to interact with the file. A developer may pass :utf8 as an
option when opening the file, then the slower IO.read/2 and
IO.write/2 functions must be used as they are responsible for
doing the proper conversions and data guarantees.
Note that filenames when given as char lists in Elixir are always treated as UTF-8. In particular, we expect that the shell and the operating system are configured to use UTF8 encoding. Binary filenames are considering raw and passed to the OS as is.
API
Most of the functions in this module return :ok or
{:ok, result} in case of success, {:error, reason}
otherwise. Those function are also followed by a variant
that ends with ! which returns the result (without the
{:ok, result} tuple) in case of success or raises an
exception in case it fails. For example:
File.read("hello.txt")
#=> {:ok, "World"}
File.read("invalid.txt")
#=> {:error, :enoent}
File.read!("hello.txt")
#=> "World"
File.read!("invalid.txt")
#=> raises File.Error
In general, a developer should use the former in case he wants to react if the file does not exist. The latter should be used when the developer expects his software to fail in case the file cannot be read (i.e. it is literally an exception).
Processes and raw files
Every time a file is opened, Elixir spawns a new process. Writing to a file is equivalent to sending messages to that process that writes to the file descriptor.
This means files can be passed between nodes and message passing guarantees they can write to the same file in a network.
However, you may not always want to pay the price for this abstraction.
In such cases, a file can be opened in :raw mode. The options :read_ahead
and :delayed_write are also useful when operating large files or
working with files in tight loops.
Check http://www.erlang.org/doc/man/file.html#open-2 for more information about such options and other performance considerations.
Summary
Functions
Sets the current working directory
Changes the current directory to the given path,
executes the given function and then revert back
to the previous path regardless if there is an exception
Changes the user group given by the group id gid
for a given file. Returns :ok on success, or
{:error, reason} on failure
Same as chgrp/2, but raises an exception in case of failure. Otherwise :ok
Changes the unix file mode for a given file.
Returns :ok on success, or {:error, reason}
on failure
Same as chmod/2, but raises an exception in case of failure. Otherwise :ok
Changes the owner given by the user id uid
for a given file. Returns :ok on success,
or {:error, reason} on failure
Same as chown/2, but raises an exception in case of failure. Otherwise :ok
Closes the file referenced by io_device. It mostly returns :ok, except
for some severe errors such as out of memory
Copies the contents of source to destination
The same as copy/3 but raises an File.CopyError if it fails.
Returns the bytes_copied otherwise
Copies the contents in source to destination preserving its mode
The same as cp/3, but raises File.CopyError if it fails.
Returns the list of copied files otherwise
Copies the contents in source to destination
The same as cp_r/3, but raises File.CopyError if it fails.
Returns the list of copied files otherwise
Gets the current working directory
Returns true if the path is a directory
Returns true if the given path exists.
It can be regular file, directory, socket,
symbolic link, named pipe or device file
Creates a symbolic link new to the file or directory existing
Returns list of files in the given directory
The same as ls/1 but raises File.Error
in case of an error
Tries to create the directory path. Missing parent directories are not created.
Returns :ok if successful, or {:error, reason} if an error occurs
Same as mkdir/1, but raises an exception in case of failure. Otherwise :ok
Tries to create the directory path. Missing parent directories are created.
Returns :ok if successful, or {:error, reason} if an error occurs
Same as mkdir_p/1, but raises an exception in case of failure. Otherwise :ok
Opens the given path according to the given list of modes
Similar to open/2 but expects a function as last argument
Same as open/2 but raises an error if file could not be opened
Same as open/3 but raises an error if file could not be opened
Returns {:ok, binary}, where binary is a binary data object that contains the contents
of path, or {:error, reason} if an error occurs
Returns binary with the contents of the given filename or raises
File.Error if an error occurs
Returns true if the path is a regular file
Tries to delete the file path
Remove files and directories recursively at the given path.
Symlinks are not followed but simply removed, non-existing
files are simply ignored (i.e. doesn’t make this function fail)
Same as rm_rf/1 but raises File.Error in case of failures,
otherwise the list of files or directories removed
Tries to delete the dir at path.
Returns :ok if successful, or {:error, reason} if an error occurs
Same as rmdir/1, but raises an exception in case of failure. Otherwise :ok
Same as stat/2 but returns the File.Stat directly and
throws File.Error if an error is returned
Returns a File.Stream for the given path with the given modes
Updates modification time (mtime) and access time (atime) of the given file. File is created if it doesn’t exist
Same as touch/2 but raises an exception if it fails.
Returns :ok otherwise
Writes content to the file path
Same as write/3 but raises an exception if it fails, returns :ok otherwise
Writes the given File.Stat back to the filesystem at the given
path. Returns :ok or {:error, reason}
Same as write_stat/3 but raises an exception if it fails.
Returns :ok otherwise
Types
io_device :: :file.io_device
mode ::
:append |
:binary |
:compressed |
:delayed_write |
:exclusive |
:raw |
:read |
:read_ahead |
:sync |
:write |
{:encoding, :latin1 | :unicode | :utf16 | :utf32 | :utf8 | {:utf16, :big | :little} | {:utf32, :big | :little}} |
{:read_ahead, pos_integer} |
{:delayed_write, non_neg_integer, non_neg_integer}
posix :: :file.posix
stat_options :: [{:time, :local | :universal | :posix}]
Functions
Sets the current working directory.
Returns :ok if successful, {:error, reason} otherwise.
Specs
cd!(Path.t, (() -> res)) ::
res |
no_return when res: var
Changes the current directory to the given path,
executes the given function and then revert back
to the previous path regardless if there is an exception.
Raises an error if retrieving or changing the current directory fails.
Changes the user group given by the group id gid
for a given file. Returns :ok on success, or
{:error, reason} on failure.
Specs
chgrp!(Path.t, non_neg_integer) :: :ok | no_return
Same as chgrp/2, but raises an exception in case of failure. Otherwise :ok.
Changes the unix file mode for a given file.
Returns :ok on success, or {:error, reason}
on failure.
Specs
chmod!(Path.t, non_neg_integer) :: :ok | no_return
Same as chmod/2, but raises an exception in case of failure. Otherwise :ok.
Changes the owner given by the user id uid
for a given file. Returns :ok on success,
or {:error, reason} on failure.
Specs
chown!(Path.t, non_neg_integer) :: :ok | no_return
Same as chown/2, but raises an exception in case of failure. Otherwise :ok.
Closes the file referenced by io_device. It mostly returns :ok, except
for some severe errors such as out of memory.
Note that if the option :delayed_write was used when opening the file,
close/1 might return an old write error and not even try to close the file.
See open/2.
Copies the contents of source to destination.
Both parameters can be a filename or an io device opened
with open/2. bytes_count specifies the number of
bytes to copy, the default being :infinity.
If file destination already exists, it is overwritten
by the contents in source.
Returns {:ok, bytes_copied} if successful,
{:error, reason} otherwise.
Compared to the cp/3, this function is more low-level,
allowing a copy from device to device limited by a number of
bytes. On the other hand, cp/3 performs more extensive
checks on both source and destination and it also preserves
the file mode after copy.
Typical error reasons are the same as in open/2,
read/1 and write/3.
The same as copy/3 but raises an File.CopyError if it fails.
Returns the bytes_copied otherwise.
Copies the contents in source to destination preserving its mode.
If a file already exists in the destination, it invokes a
callback which should return true if the existing file
should be overwritten, false otherwise. It defaults to return true.
It returns :ok in case of success, returns
{:error, reason} otherwise.
If you want to copy contents from an io device to another device
or do a straight copy from a source to a destination without
preserving modes, check copy/3 instead.
Note: The command cp in Unix systems behaves differently depending
if destination is an existing directory or not. We have chosen to
explicitly disallow this behaviour. If destination is a directory, an
error will be returned.
The same as cp/3, but raises File.CopyError if it fails.
Returns the list of copied files otherwise.
Specs
Copies the contents in source to destination.
If the source is a file, it copies source to
destination. If the source is a directory, it copies
the contents inside source into the destination.
If a file already exists in the destination,
it invokes a callback which should return
true if the existing file should be overwritten,
false otherwise. It defaults to return true.
If a directory already exists in the destination where a file is meant to be (or otherwise), this function will fail.
This function may fail while copying files, in such cases, it will leave the destination directory in a dirty state, where already copied files won’t be removed.
It returns {:ok, files_and_directories} in case of
success with all files and directories copied in no
specific order, {:error, reason, file} otherwise.
Note: The command cp in Unix systems behaves differently
depending if destination is an existing directory or not.
We have chosen to explicitly disallow this behaviour.
Examples
# Copies "a.txt" to "tmp"
File.cp_r "a.txt", "tmp.txt"
# Copies all files in "samples" to "tmp"
File.cp_r "samples", "tmp"
# Same as before, but asks the user how to proceed in case of conflicts
File.cp_r "samples", "tmp", fn(source, destination) ->
IO.gets("Overwriting #{destination} by #{source}. Type y to confirm.") == "y"
end
The same as cp_r/3, but raises File.CopyError if it fails.
Returns the list of copied files otherwise.
Specs
cwd :: {:ok, binary} | {:error, posix}
Gets the current working directory.
In rare circumstances, this function can fail on Unix. It may happen
if read permission does not exist for the parent directories of the
current directory. For this reason, returns {:ok, cwd} in case
of success, {:error, reason} otherwise.
Specs
exists?(Path.t) :: boolean
Returns true if the given path exists.
It can be regular file, directory, socket,
symbolic link, named pipe or device file.
Examples
File.exists?("test/")
#=> true
File.exists?("missing.txt")
#=> false
File.exists?("/dev/null")
#=> true
Creates a symbolic link new to the file or directory existing.
Returns :ok if successful, {:error, reason} otherwise.
If the operating system does not support symlinks, returns
{:error, :enotsup}.
Returns list of files in the given directory.
It returns {:ok, [files]} in case of success,
{:error, reason} otherwise.
Specs
ls!(Path.t) :: [binary] | no_return
The same as ls/1 but raises File.Error
in case of an error.
Tries to create the directory path. Missing parent directories are not created.
Returns :ok if successful, or {:error, reason} if an error occurs.
Typical error reasons are:
:eacces- missing search or write permissions for the parent directories ofpath:eexist- there is already a file or directory namedpath:enoent- a component ofpathdoes not exist:enospc- there is a no space left on the device:enotdir- a component ofpathis not a directory; on some platforms,:enoentis returned instead
Specs
mkdir!(Path.t) :: :ok | no_return
Same as mkdir/1, but raises an exception in case of failure. Otherwise :ok.
Tries to create the directory path. Missing parent directories are created.
Returns :ok if successful, or {:error, reason} if an error occurs.
Typical error reasons are:
:eacces- missing search or write permissions for the parentdirectories of `path`:enospc- there is a no space left on the device:enotdir- a component ofpathis not a directory
Specs
mkdir_p!(Path.t) :: :ok | no_return
Same as mkdir_p/1, but raises an exception in case of failure. Otherwise :ok.
Specs
Opens the given path according to the given list of modes.
In order to write and read files, one must use the functions
in the IO module. By default, a file is opened in binary mode
which requires the functions IO.binread/2 and IO.binwrite/2
to interact with the file. A developer may pass :utf8 as an
option when opening the file and then all other functions from
IO are available, since they work directly with Unicode data.
The allowed modes:
:read- the file, which must exist, is opened for reading.:write- the file is opened for writing. It is created if it does not exist.If the file does exists, and if write is not combined with read, the file will be truncated.
:append- the file will be opened for writing, and it will be created if it does not exist. Every write operation to a file opened with append will take place at the end of the file.:exclusive- the file, when opened for writing, is created if it does not exist. If the file exists, open will return{:error, :eexist}.:char_list- when this term is given, read operations on the file will return char lists rather than binaries.:compressed- makes it possible to read or write gzip compressed files.The compressed option must be combined with either read or write, but not both. Note that the file size obtained with
stat/1will most probably not match the number of bytes that can be read from a compressed file.:utf8- this option denotes how data is actually stored in the disk file and makes the file perform automatic translation of characters to and from utf-8.If data is sent to a file in a format that cannot be converted to the utf-8 or if data is read by a function that returns data in a format that cannot cope with the character range of the data, an error occurs and the file will be closed.
Check http://www.erlang.org/doc/man/file.html#open-2 for more information about
other options like :read_ahead and :delayed_write.
This function returns:
{:ok, io_device}- the file has been opened in the requested mode.io_deviceis actually the pid of the process which handles the file. This process is linked to the process which originally opened the file. If any process to which theio_deviceis linked terminates, the file will be closed and the process itself will be terminated.An
io_devicereturned from this call can be used as an argument to theIOmodule functions.{:error, reason}- the file could not be opened.
Examples
{:ok, file} = File.open("foo.tar.gz", [:read, :compressed])
IO.read(file, :line)
File.close(file)
Similar to open/2 but expects a function as last argument.
The file is opened, given to the function as argument and automatically closed after the function returns, regardless if there was an error when executing the function.
It returns {:ok, function_result} in case of success,
{:error, reason} otherwise.
This function expects the file to be closed with success,
which is usually the case unless the :delayed_write option
is given. For this reason, we do not recommend passing
:delayed_write to this function.
Examples
File.open("file.txt", [:read, :write], fn(file) ->
IO.read(file, :line)
end)
Same as open/2 but raises an error if file could not be opened.
Returns the io_device otherwise.
Same as open/3 but raises an error if file could not be opened.
Returns the function result otherwise.
Returns {:ok, binary}, where binary is a binary data object that contains the contents
of path, or {:error, reason} if an error occurs.
Typical error reasons:
:enoent- the file does not exist:eacces- missing permission for reading the file,or for searching one of the parent directories:eisdir- the named file is a directory:enotdir- a component of the file name is not a directory;on some platforms, `:enoent` is returned instead:enomem- there is not enough memory for the contents of the file
You can use :file.format_error/1 to get a descriptive string of the error.
Specs
read!(Path.t) :: binary | no_return
Returns binary with the contents of the given filename or raises
File.Error if an error occurs.
Specs
regular?(Path.t) :: boolean
Returns true if the path is a regular file.
Examples
File.regular? __ENV__.file #=> true
Tries to delete the file path.
Returns :ok if successful, or {:error, reason} if an error occurs.
Note the file is deleted even if in read-only mode.
Typical error reasons are:
:enoent- the file does not exist:eacces- missing permission for the file or one of its parents:eperm- the file is a directory and user is not super-user:enotdir- a component of the file name is not a directory;on some platforms, enoent is returned instead:einval- filename had an improper type, such as tuple
Examples
File.rm('file.txt')
#=> :ok
File.rm('tmp_dir/')
#=> {:error, :eperm}
Specs
rm!(Path.t) :: :ok | no_return
Same as rm/1, but raises an exception in case of failure. Otherwise :ok.
Remove files and directories recursively at the given path.
Symlinks are not followed but simply removed, non-existing
files are simply ignored (i.e. doesn’t make this function fail).
Returns {:ok, files_and_directories} with all files and
directories removed in no specific order, {:error, reason, file}
otherwise.
Examples
File.rm_rf "samples"
#=> {:ok, ["samples", "samples/1.txt"]}
File.rm_rf "unknown"
#=> {:ok, []}
Specs
rm_rf!(Path.t) :: [binary] | no_return
Same as rm_rf/1 but raises File.Error in case of failures,
otherwise the list of files or directories removed.
Tries to delete the dir at path.
Returns :ok if successful, or {:error, reason} if an error occurs.
Examples
File.rmdir('tmp_dir')
#=> :ok
File.rmdir('file.txt')
#=> {:error, :enotdir}
Same as rmdir/1, but raises an exception in case of failure. Otherwise :ok.
Specs
stat(Path.t, stat_options) ::
{:ok, File.Stat.t} |
{:error, posix}
Returns information about the path. If it exists, it
returns a {:ok, info} tuple, where info is a
File.Stat struct. Returns {:error, reason} with
the same reasons as read/1 if a failure occurs.
Options
The accepted options are:
:time-:local | :universal | :posix; default::local
Specs
stat!(Path.t, stat_options) ::
File.Stat.t |
no_return
Same as stat/2 but returns the File.Stat directly and
throws File.Error if an error is returned.
Returns a File.Stream for the given path with the given modes.
The stream implements both Enumerable and Collectable protocols,
which means it can be used both for read and write.
The line_or_byte argument configures how the file is read when
streaming, by :line (default) or by a given number of bytes.
Operating the stream can fail on open for the same reasons as
File.open!/2. Note that the file is automatically opened only and
every time streaming begins. There is no need to pass :read and
:write modes, as those are automatically set by Elixir.
Raw files
Since Elixir controls when the streamed file is opened, the underlying
device cannot be shared and as such it is convenient to open the file
in raw mode for performance reasons. Therefore, Elixir will open
streams in :raw mode with the :read_ahead option unless an encoding
is specified.
One may also consider passing the :delayed_write option if the stream
is meant to be written to under a tight loop.
Updates modification time (mtime) and access time (atime) of the given file. File is created if it doesn’t exist.
Specs
touch!(Path.t, :calendar.datetime) :: :ok | no_return
Same as touch/2 but raises an exception if it fails.
Returns :ok otherwise.
Writes content to the file path.
The file is created if it does not exist. If it exists, the previous
contents are overwritten. Returns :ok if successful, or {:error, reason}
if an error occurs.
Warning: Every time this function is invoked, a file descriptor is opened
and a new process is spawned to write to the file. For this reason, if you are
doing multiple writes in a loop, opening the file via File.open/2 and using
the functions in IO to write to the file will yield much better performance
then calling this function multiple times.
Typical error reasons are:
:enoent- a component of the file name does not exist:enotdir- a component of the file name is not a directory;on some platforms, enoent is returned instead:enospc- there is a no space left on the device:eacces- missing permission for writing the file or searching one ofthe parent directories:eisdir- the named file is a directory
Check File.open/2 for other available options.
Same as write/3 but raises an exception if it fails, returns :ok otherwise.
Specs
write_stat(Path.t, File.Stat.t, stat_options) ::
:ok |
{:error, posix}
Writes the given File.Stat back to the filesystem at the given
path. Returns :ok or {:error, reason}.
Specs
write_stat!(Path.t, File.Stat.t, stat_options) ::
:ok |
no_return
Same as write_stat/3 but raises an exception if it fails.
Returns :ok otherwise.