Skip to content

Commit 4d5696e

Browse files
author
José Valim
committed
Merge pull request #2367 from chyndman/file-rm-windows-read-write
File.rm makes files writeable on Windows before deletion
2 parents 892f211 + 32c5694 commit 4d5696e

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

lib/elixir/lib/file.ex

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,15 @@ defmodule File do
765765
"""
766766
@spec rm(Path.t) :: :ok | {:error, posix}
767767
def rm(path) do
768+
if match? {:win32, _}, :os.type do
769+
case F.read_file_info(IO.chardata_to_string(path)) do
770+
{:ok, file_info} ->
771+
if elem(file_info, 3) in [:read, :none] do
772+
File.chmod(path, (elem(file_info, 7) + 0200))
773+
end
774+
{:error, reason} -> {:error, reason}
775+
end
776+
end
768777
F.delete(IO.chardata_to_string(path))
769778
end
770779

lib/elixir/test/elixir/file_test.exs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,15 @@ defmodule FileTest do
688688
assert File.rm(fixture) == :ok
689689
refute File.exists?(fixture)
690690
end
691+
692+
test :rm_read_only_file do
693+
fixture = tmp_path("tmp_test.txt")
694+
File.write(fixture, "test")
695+
assert File.exists?(fixture)
696+
File.chmod(fixture, 0100444)
697+
assert File.rm(fixture) == :ok
698+
refute File.exists?(fixture)
699+
end
691700

692701
test :rm_file_with_dir do
693702
assert File.rm(fixture_path) == {:error, :eperm}

0 commit comments

Comments
 (0)