2016-12-22 45 views
1

藥劑1.3.2爲什麼我不能用Tilde刪除文件?

二郎山/ OTP 19

的Windows 7(標準用戶和管理員)

我試圖破解在一起的小藥劑腳本環繞commiting文件與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~", 

(截斷以節省空間)

我可以檢查包含~列表中的字符串,它回來真的。所以我並沒有想象那裏會出現波浪。

我在目錄中創建了一個名爲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

'Path.wildcard(「*〜」)|> Enum.each(&File.rm/1)''? '*'不會被'File.rm/1'擴展。 – Dogbert

+0

嗯。沒有意識到File.rm不會擴展通配符。這是否記錄在某處,我在研究它時錯過了它? –

+0

那麼,我會考慮沒有記錄的意思,它不會被擴大。 – Dogbert

回答

4

File.rm將不處理通配符自動據我所知,你需要使用Path.wildcard功能:

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

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

的多個文件(這是可能是更一般的情況

+0

這些應該是你的第二個代碼片段(在我的意思是'Path.wildcard'參數)單引號? –

+0

@OnorioCatenacci您可能需要在Windows上使用雙引號,在Linux/OS X上使用單引號。 –

+0

你不知道Elixir的單引號和雙引號之間的區別嗎? http://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html#char-lists –

2

在Unix命令行中,rm將由shell調用 - 並且shell負責通配符擴展,va在調用實際命令之前進行可變插補等。所以嚴格來說,Unix rm不支持通配符 - 它就是shell; rm只是循環其參數並在其中每個參數上調用unlink()系統調用。 Erlang庫模仿這種行爲。(在Windows上,shell不進行通配符擴展,至少不是經典的shell - 我不知道PowerShell,命令必須自己做,這在編寫命令行實用程序時非常惱人,至少,這是當我涉足Windows時最先進的技術;-))

相關問題