为什么我不能用Tilde删除文件?

时间:2016-12-22 14:58:57

标签: windows file-io erlang elixir

Elixir 1.3.2

Erlang / OTP 19

Windows 7(标准用户和管理员)

我试图破解一个小的Elixir脚本来将提交文件包装到git中。我做的第一件事就是确保我不会意外地使用emacs创建临时文件,这是File.rm(" *〜")。但是,这就是我得到的:

iex(2)> File.rm("*~")
{:error, :eio}

所以我尝试了File.rm("*.*~")。结果相同。当我作为标准用户(我通常在Windows上工作)或作为管理员运行时,我会得到相同的行为,因此它似乎也没有任何权限。

所以我将文件捕获到列表中。

iex(15)> {:ok,files} = File.ls
{:ok,
 [".git", ".gitattributes", ".gitignore", "add.factor", "async_ut",
  "async_ut.cs", "cng_maint", "codecvg.cmd", "codecvg_rkt.cmd",
  "codecvg_rkt.cmd~", "CreateBr.vbs", "DevSandbox", "distillery", "dk.cmd",
  "example.scm", "example.sql", "factor", "fsele", "fsharp", "glp.vbs",
  "lwwtww.org", "mrgmain.cmd", "MrgMain.vbs", "mrgtrunk.cmd", "mrgtrunk.cmd~",

(截断以节省空间)

我可以检查包含~的列表中的字符串,然后它返回true。所以我并没有想到波士顿在那里。

我在目录中创建了一个名为test.txt的临时文件。 File.rm删除了那个就好了所以它似乎是导致问题的~。我也试过这些:

iex(7)> File.rm("*\~")
{:error, :eio}
iex(8)> File.rm("*\7F") #7F is hex code of ~
{:error, :eio}

没有运气,你可以看到。

使用Elixir和File.rm搜索有关:eio的任何内容并没有提供任何有用的信息。我可以尝试安装1.4.0,看看是否有效果,但我只是想看看我是否遗漏了一些愚蠢而明显的东西。

我也在机器上安装了cygwin,所以我尝试删除这些文件。 rm *~完全符合预期(在标准用户下)。

似乎这在某种程度上是Erlang特定的问题,但我先在这里做了一件事。我做了一件明显不对的事吗?

2 个答案:

答案 0 :(得分:4)

据我所知,File.rm不会自动处理通配符,你需要使用Path.wildcard函数:

File.rm(Path.wildcard("*~"))

Path.wildcard('*~') |> Enum.each(fn x -> File.rm(x) end)

对于多个文件(这可能是更常见的情况。

答案 1 :(得分:1)

在Unix命令行上,shell将调用rm - 在调用实际命令之前,shell负责通配符扩展,变量插值等。严格来说,Unix rm也不支持通配符 - 它是shell; rm只是遍历其参数并在每个参数上调用unlink()系统调用。 Erlang库模仿了这种行为。

(在Windows上,shell不进行通配符扩展,至少不是经典的shell - 我不知道PowerShell。命令必须自己执行此操作,这在编写命令行实用程序时非常烦人。至少,当我涉足Windows时,这是最先进的技术; - ))