Packages
moar
1.61.2
5.0.0
4.3.0
4.2.0
4.1.0
4.0.0
3.2.0
3.1.0
3.0.0
2.7.0
2.6.0
2.5.0
2.4.2
2.4.1
2.4.0
2.3.0
2.2.0
2.1.0
2.0.1
2.0.0
1.64.0
1.63.1
1.63.0
1.62.0
1.61.2
1.61.1
1.61.0
1.60.0
1.59.2
1.59.1
1.59.0
1.58.0
1.57.0
1.56.2
1.56.1
1.56.0
1.55.0
1.54.0
1.53.0
1.52.1
1.52.0
1.51.0
1.50.0
1.49.0
1.48.0
1.47.0
1.46.0
1.45.1
1.45.0
1.44.0
1.43.0
1.42.0
1.41.0
1.40.0
1.39.0
1.38.0
1.37.0
1.36.0
1.35.0
1.34.0
1.33.0
1.32.0
1.31.0
1.30.0
1.29.0
1.28.0
1.27.0
1.26.0
1.25.0
1.24.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.0
1.19.3
1.19.2
1.19.1
1.19.0
1.18.1
1.18.0
1.17.0
1.16.0
1.15.0
1.14.0
1.13.1
1.13.0
1.12.0
1.11.0
1.10.0
1.9.0
1.8.0
1.7.0
1.6.0
1.5.0
1.4.0
1.3.0
1.2.0
1.1.0
1.0.0
0.1.0
A dependency-free utility library containing 100+ useful functions.
Current section
Files
Jump to
Current section
Files
lib/file.ex
defmodule Moar.File do
# @related [test](/test/file_test.exs)
@moduledoc "File-related functions."
@doc "Generate a sha256 checksum of a file's contents"
@spec checksum(Path.t()) :: binary()
def checksum(path) do
stream!(path, 2048)
|> Enum.reduce(:crypto.hash_init(:sha256), fn line, acc -> :crypto.hash_update(acc, line) end)
|> :crypto.hash_final()
|> Base.encode16()
|> String.downcase()
end
@doc """
Returns a randomly-named path in the system temp directory. Does not actually create the file at the path.
For example, `Moar.File.new_tempfile_path(".txt")` would return something like
`"/var/folders/3r/n09zyyy16yddj9m2d1ppzvt40000gn/T/XY7V5E26DV.txt"`.
```elixir
iex> Moar.File.new_tempfile_path(".txt") |> File.exists?()
false
```
"""
@spec new_tempfile_path(file_extension :: binary()) :: binary()
def new_tempfile_path(file_extension),
do: System.tmp_dir!() |> Path.join(Moar.Random.string(10, :base32) <> file_extension)
if Version.compare(System.version(), "1.16.0") in [:gt, :eq] do
@doc "Delegates to `File.stream!/2` in a way that's compatible with older Elixir versions."
@spec stream!(Path.t(), pos_integer()) :: File.Stream.t()
def stream!(path, bytes), do: File.stream!(path, bytes)
else
@doc "Delegates to `File.stream!/2` in a way that's compatible with older Elixir versions."
@spec stream!(Path.t(), pos_integer()) :: File.Stream.t()
def stream!(path, bytes), do: File.stream!(path, [], bytes)
end
@doc """
Writes `contents` to a new temp file with extension `file_extension`, and returns the path to the file.
For example, `Moar.File.write_tempfile("hello", ".txt")` would create a file in a path something like
`/var/folders/3r/n09zyyy16yddj9m2d1ppzvt40000gn/T/RHUEJCCH22.txt` with the contents `hello`.
```elixir
iex> Moar.File.write_tempfile("hello", ".txt") |> File.read!()
"hello"
```
"""
@spec write_tempfile(contents :: iodata(), file_extension :: binary()) :: binary()
def write_tempfile(contents, file_extension),
do: file_extension |> new_tempfile_path() |> tap(&File.write!(&1, contents, [:append]))
end