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特定的问题,但我先在这里做了一件事。我做了一件明显不对的事吗?
答案 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时,这是最先进的技术; - ))