Windows 为什么可以';我不能用波浪线删除文件吗?

Windows 为什么可以';我不能用波浪线删除文件吗?,windows,file-io,erlang,elixir,Windows,File Io,Erlang,Elixir,长生不老药1.3.2 Erlang/OTP 19 Windows 7(标准用户和管理员) 我正在尝试拼凑一个小的Elixir脚本来包装提交给git的文件。我要做的第一件事是File.rm(“*~”),以确保不会意外地暂存emacs创建的临时文件。然而,我得到的是: iex(2)> File.rm("*~") {:error, :eio} 所以我尝试了File.rm(“*.*”)。同样的结果。当我以标准用户(这是我通常在Windows上工作的方式)或管理员的身份运行时,我会得到相同的行为,

长生不老药1.3.2

Erlang/OTP 19

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

我正在尝试拼凑一个小的Elixir脚本来包装提交给git的文件。我要做的第一件事是File.rm(“*~”),以确保不会意外地暂存emacs创建的临时文件。然而,我得到的是:

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的问题,但我先在这里发言。我是否有明显的错误?

不会自动处理通配符据我所知,您需要使用以下功能:

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

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

不会自动处理通配符。据我所知,您需要使用以下函数:

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


对于多个文件(这可能是更一般的情况)。

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


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

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


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

如何
Path.wildcard(“*~”)>Enum.each(&File.rm/1)<代码> *>代码>不会被<代码>文件> RM/1 扩展。Hmm.没有意识到文件RM不会扩展通配符。在我研究的时候,有没有文件被记录在哪里?我想没有文档化的意思,它不会被扩展。我想这是可以暗示的,是的。我只是假设它可以处理WIL。dcard,因为它似乎是操作系统的rm命令的包装器。Unix的
rm
也不扩展通配符。我不确定Windows。如何使用
Path.wildcard(“*~”)|>Enum.each(&File.rm/1)<代码> *>代码>不会被<代码>文件> RM/1 扩展。Hmm.没有意识到文件RM不会扩展通配符。在我研究的时候,有没有文件被记录在哪里?我想没有文档化的意思,它不会被扩展。我想这是可以暗示的,是的。我只是假设它可以处理WIL。dcard,因为它似乎是操作系统rm命令的包装。Unix的
rm
也不扩展通配符。我不确定Windows。这些是否应该是第二个代码片段上的单引号(在
路径中。我指的是通配符
参数中)?@OnorioCatenacci您可能需要在Windows上使用双引号,在Linux/OS X上使用单引号。您不知道Elixir上的单引号和双引号之间的区别吗?我所说的双引号是针对Windows shell的,不是针对Elixir的。这些应该是您的第二个代码片段上的单引号吗(我的意思是在
Path.wildcard
参数中)?@OnorioCatenacci您可能需要在Windows上使用双引号,在Linux/OS X上使用单引号。您不知道Elixir上的单引号和双引号之间的区别吗?我所说的双引号是针对Windows shell的,不是针对Elixir的。