Skip to content

Commit c3e5054

Browse files
author
José Valim
committed
Merge pull request #899 from n1rvana/master
Added File.ls & File.ls!
2 parents b954d53 + 34da5f8 commit c3e5054

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

lib/elixir/lib/file.ex

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,45 @@ defmodule File do
897897
end
898898
end
899899

900+
901+
@doc """
902+
Returns list of files in the current working directory. In rare circumstances, this function can
903+
fail on Unix. It may happen if read permission does not exist for the parent
904+
directories of the current directory. For this reason, returns `{ :ok, [files] }`
905+
in case of success, `{ :error, reason }` otherwise.
906+
"""
907+
def ls() do
908+
ls(".")
909+
end
910+
911+
@doc """
912+
Returns list of files in the given directory. In rare circumstances, this function can
913+
fail on Unix. It may happen if read permission does not exist for the parent
914+
directories of the current directory. For this reason, returns `{ :ok, [files] }`
915+
in case of success, `{ :error, reason }` otherwise.
916+
"""
917+
def ls(path) do
918+
case F.list_dir(path) do
919+
{ :ok, file_list } -> { :ok, Enum.map file_list, :unicode.characters_to_binary(&1) }
920+
{ :error, _ } = error -> error
921+
end
922+
end
923+
924+
925+
@doc """
926+
Get list of files in directories in `dir`.
927+
928+
Raises File.Error in case of an error.
929+
"""
930+
def ls!(dir) do
931+
case F.list_dir(dir) do
932+
{ :ok, file_list } -> Enum.map file_list, :unicode.characters_to_binary(&1)
933+
{ :error, reason } ->
934+
raise File.Error, reason: reason, action: "list directory", path: :unicode.characters_to_binary(dir)
935+
end
936+
end
937+
938+
900939
@doc """
901940
Closes the file referenced by `io_device`. It mostly returns `:ok`, except
902941
for some severe errors such as out of memory.

lib/elixir/test/elixir/file_test.exs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,33 @@ defmodule FileTest do
397397
end
398398
end
399399

400+
test :ls do
401+
{code, value} = File.ls(fixture_path)
402+
assert code == :ok
403+
refute code == :error
404+
assert is_list value
405+
assert 0 < Enum.count(value)
406+
assert List.member?(value, "code_sample.exs")
407+
assert List.member?(value, "file.txt")
408+
{code2, reason} = File.ls(fixture_path("non-existent-subdirectory"))
409+
refute code2 == :ok
410+
assert code2 == :error
411+
assert reason != nil
412+
end
413+
414+
test :ls2 do
415+
value = File.ls!(fixture_path)
416+
assert is_list value
417+
assert 0 < Enum.count(value)
418+
assert List.member?(value, "code_sample.exs")
419+
assert List.member?(value, "file.txt")
420+
assert_raise File.Error, fn ->
421+
File.ls!(fixture_path("non-existent-subdirectory"))
422+
end
423+
end
424+
425+
426+
400427
defmodule OpenReadWrite do
401428
use ExUnit.Case
402429

0 commit comments

Comments
 (0)