Because we want to call Temp.cleanup/0 at any time and expect that the files are not only removed but also the disk space is reclaimed.
We store not only the file path, but also the file decriptor associated to it, this two friends go to Temp.Tracker's state so Temp.cleanup/0 is now able to close the file before removing it, at any time.
An Elixir module to easily create and use temporary files and directories. The module is inspired by node-temp.
Add the dependency to your mix.exs deps:
defp deps do
[{:temp, "~> 0.4"}]
end# just get a path
{:ok, tmp_path} = Temp.path
# with a prefix
{:ok, tmp_path} = Temp.path "my-prefix"
# with prefix and suffix
{:ok, tmp_path} = Temp.path %{prefix: "my-prefix", suffix: "my-suffix"}
# in a non-default tmp_dir
{:ok, tmp_path} = Temp.path %{prefix: "my-prefix", suffix: "my-suffix", basedir: "/my-tmp"}
# error on fail
tmp_path = Temp.path!Note that you can use all the options available for Temp.path as the first argument.
# tmp dir
{:ok, dir_path} = Temp.mkdir "my-dir"
IO.puts dir_path
File.write Path.join(dir_path, "file_in_my_dir"), "some content"
# remove when done
File.rm_rf dir_pathYou can use the Temp.mkdir! if you prefer to have an error on failure.
Note that you can use all the options available for Temp.path as the first argument.
# tmp file
{:ok, fd, file_path} = Temp.open "my-file"
IO.puts file_path
IO.write fd, "some content"
File.close fd
# remove when done
File.rm file_pathYou can also pass a function to open and use the file descriptor in it. In this case, the file will be closed automatically.
# tmp file
{:ok, file_path} = Temp.open "my-file", &IO.write(&1, "some content")
IO.puts file_path
IO.puts File.read!(file_path)
# remove when done
File.rm file_pathBy default, you have to cleanup the files by yourself, however, you can tell
Temp to track the temporary files automatically.
You just need to call Temp.track (or the bang version Temp.track!) and you are done.
Temporary files will be cleaned up automatically when the process exits.
You can also call Temp.cleanup if you want to clean them before the process exits.
Here is an example of how to use it:
Temp.track!
dir_path = Temp.mkdir! "my-dir"
File.write Path.join(dir_path, "file_in_my_dir"), "some content"
file_path = Temp.open! "my-file", &IO.write(&1, "some content")
IO.puts file_path
IO.puts inspect(Temp.tracked)
# cleanup
Temp.cleanup
dir_path = Temp.mkdir
# this will be cleaned up on exitThis source code is licensed under the MIT License. Copyright (c) 2015, Daniel Perez. All rights reserved.