2017-01-12 7 views
2

Rubyのコアクラス/モジュールを使用してファイルが存在しないかどうかを確認する方法は何ですか?ルビにファイルが存在しないかどうかを確認する方法は何ですか?

他の方法よりも1つの方法を選択することが理にかなっている理由も分かります。例:Dir['**/*'].grep(/foo/)を使用すると、正規表現を使用してパスに一致することがわかった最短の方法です。

しかし、Pathnameは通常「うまくいく」と思われるクロスプラットフォームソリューションであるため、Pathname.new('.').find.any? { |pn| pn.fnmatch? "*foo*" }は良い選択だと思います。

私が見逃した解決策/クラス/モジュールはありますか?また、スピード/効率分析を含む回答に感謝します。

require 'minitest/autorun' 
require 'pathname' 

class TestTouch < Minitest::Test 
    include FileUtils 
    attr_reader :foo 
    def setup 
    @foo = Pathname.new('foo') 
    foo.delete if foo.exist? 
    end 

    def teardown 
    foo.delete if foo.exist? 
    end 

    def test_touch 
    touch foo 
    cwd = Pathname.new('.') 
    assert cwd.find.to_a.map(&:to_s).grep(/foo/).any? 
    assert cwd.find.any? { |pn| pn.fnmatch? "*foo*" } 
    assert cwd.join('foo').exist? 
    assert Dir['**/*'].grep(/foo/) 
    assert Dir.glob('**/*').grep(/foo/) 
    assert !Dir.glob('foo').empty? 
    assert File.exist?('foo') 
    end 
end 
+0

コードに 'File.exist?'があります。どうしたの?それがあなたが必要とするものです。 Pathnameモジュールを含め、ここに必要なすべてのツールがあります。これに関係するシェルはありません。 – tadman

答えて

1

...

Pathname.exist?(NAME) 
FileTest.exist?(NAME) 
Pathname.file?(NAME) 
FileTest.file?(NAME) 
1

どの程度

File.exists?(NAME) 

? NAMEがたとえばディレクトリの場合は、これもtrueを返すことに注意してください。あなたが存在を確認し、アトミック操作でファイルを開く必要がある場合は、私の頭の上オフ

+0

'存在しますか?'の代わりに '存在する'を使用しています – akuhn

+0

@akuhn: '存在するのですか?'それは良く読んでいます:D –

+1

Rubyの述語関数は 's 'これは廃止されました。 – akuhn

1

は、時々この

File.exist?(fname) 
File.file?(fname) 

かかわらを試してみてください最高のことができています例外を救済することによってファイルを開き、欠落したファイルの大文字小文字を処理するだけです。

なぜそれは良い考えですか?これは、データベースとキャッシュ層を扱う際にバックエンドのインフラストラクチャコードに適用されます。場合によっては、ファイルを削除または置き換えてブランチを作成してコンテンツを使用する間にコードが影響を受けないことが重要になることがあります。ファイルが削除されてもハンドルは開いたままで使用できます。

begin 
    File.open(fname) { ... } 
rescue Errno::ENOENT => e 
    ... 
end 

ENOENTすべてのエラーコードの完全なリストについては、「ファイルが見つかりません」のCライブラリのエラーコードhereを参照してくださいです。 Rubyのファイル処理の大部分は、基本的に基本となるCライブラリの周りの薄いラッパーです。あなたは既にFileクラスをブラウズして気づいたかもしれません。

+0

ちょっと好奇心:なぜそれは良い考えですか? –

+0

それはあなたのdownvoteは何ですか?場合によっては、開いているファイルのハンドルをすぐに取得することが重要な場合があります。そのため、そのブランチを作成している間にファイルが削除されても、コードには影響しません。ファイルが削除されると、ハンドルは開いたままであり、まだ使用できますが、これは一部の人が期待するものではありません。 – akuhn

+0

いいえ、私はちょうど興味があった。私はこれを考えなかった、説明のおかげで! –

関連する問題