2016-12-22 14 views
1

エリクシール1.3.2チルドでファイルを削除できないのはなぜですか?

のErlang/OTP 19

のWindows 7(標準ユーザーおよび管理者)

私は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} 

あなたが見ることができるように運がいいえ。

何かについてのグーグルリング:eioとElixirとFile.rmは役に立ちませんでした。私はそれが効果があるかどうかを確認するために1.4.0をインストールしようとすることができますが、私はここで何かばかげて明らかに欠けていたかどうかを見たいと思っていました。

私もマシンにcygwinを持っていますので、そのようにファイルを削除しようとしました。 rm *~は、(標準ユーザーの下で)予想どおりに機能しました。

これは何とかアーラン特有の問題だと思われますが、私はまずここでアクシングしています。明らかに間違ったことをしていますか?

+2

'Path.wildcard(" *〜 ")|> Enum.each(&File.rm/1)'はどうですか? '*'は 'File.rm/1'によって拡張されません。 – Dogbert

+0

Hmm。 File.rmがワイルドカードを展開しないことに気付かなかった。それはどこかに書かれていて、私がそれを研究していたときにそれを逃したのですか? –

+0

さて、私はそれが拡張されないことを意味すると書かれていないと考えます。 – Dogbert

答えて

4

File.rmは、私の知る限りでは、自動的にワイルドカードを処理しません、あなたはPath.wildcard機能を使用する必要があります(複数のファイルのために

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

または

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

をしています

+0

これらは、2番目のコードフラグメントの一重引用符でなければなりません( 'Path.wildcard'引数の意味ですか)? –

+0

@OnorioCatenacci Windowsでは二重引用符が必要な場合があります.Linux/OS Xでは一重引用符が機能します。 –

+0

エリクサーの一重引用符と二重引用符の違いを知りませんか? http://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html#char-lists –

2

Unixのコマンドラインでは、rmがシェルによって呼び出され、シェルはワイルドカードの拡張を行います.va実際のコマンドが呼び出される前に実行される。厳密に言えば、Unix rmはワイルドカードをサポートしていません。 rmは、引数をループして、それぞれの引数に対してunlink()システムコールを呼び出します。 Erlangライブラリはこの動作を模倣しています。

(Windowsでは、シェルは少なくとも古典的なシェルではありません。私はPowerShellについて知らないので、コマンドラインでこれを行う必要があります。コマンドラインユーティリティを書くときに大変厄介です。これはWindowsで手伝ったときの最先端のものだった;-))

関連する問題