2011-02-04 6 views
51

ディレクトリ/ファイル/シンボリックリンクなどがあるかどうかを検出する方法はありますか?エンティティ(より一般化された)存在するか?ディレクトリ/ファイル/シンボリックリンクがRubyに1つのコマンドで存在するかどうかをチェックする方法

ディレクトリ、ファイル、またはシンボリックリンクの可能性があるパスの配列をチェックする必要があるため、私は単一の関数が必要です。 File.exists?"file_path"は、ディレクトリとファイルに対しては動作しますが、シンボリックリンクには対応していません(File.symlink?"symlink_path")。

+1

使用しているRubyのバージョンは?ファイルが存在しています? OS X 10.6.6のRuby 1.9.2で私のためのシンボリックリンクのために働いています –

+1

シンボリックリンクについては、シンボリックリンクが存在すれば 'true'を返すものを求めています。 -symlink。私。壊れたリンクに対しても 'true'を返します。 'File.exists?'は、壊れていないシンボリックリンクに対してのみ 'true'を返します。 – Kelvin

答えて

102

標準ファイルモジュールは、使用可能な通常のfile testsがあります

RUBY_VERSION # => "1.9.2" 
bashrc = ENV['HOME'] + '/.bashrc' 
File.exist?(bashrc) # => true 
File.file?(bashrc) # => true 
File.directory?(bashrc) # => false 

あなたがそこに欲しいものを見つけることができるはずです。


OP:明らか

ない "おかげで私は、真または偽の3つすべてを必要とします"。 [OK]を次のように試してみてください:

def file_dir_or_symlink_exists?(path_to_file) 
    File.exist?(path_to_file) || File.symlink?(path_to_file) 
end 

file_dir_or_symlink_exists?(bashrc)       # => true 
file_dir_or_symlink_exists?('/Users')       # => true 
file_dir_or_symlink_exists?('/usr/bin/ruby')     # => true 
file_dir_or_symlink_exists?('some/bogus/path/to/a/black/hole') # => false 
+0

生の文字列連結( 'ENV [ 'HOME'] + '/ .bashrc'')は、クロスプラットフォームでは動作しません。 Rubyファイルの結合を使用する必要があります。また、Railsを使用している場合は、 'Rails.root'から起動しないでください。 'File.exists?(Rails.root.join( 'db'、 'my_seeds。csv ') ' –

+1

WindowsはBash、つまり.bashrcについて知らないので、クロスプラットフォームで動作しないことが保証されています。しかし、* nixベースのプラットフォームで動作します。しかし、[RubyのIOは自動的にWindows上でスラッシュからバックスラッシュに変換される](http://ruby-doc.org/core-2.3.3/IO.html)ので、 '/'の使用は問題ではありません。 –

11

独自の関数File.exists?(path) or File.symlink?(path)を定義して使用してみませんか?

+0

もちろん、私はそれを行うことができますが、私はすでに両方をチェックできる方法を実装したいと思います。その道のりに「何か」があるかどうかを確認することです。 – Clawsy

+1

@クラウジ私はあなたがGintautasの点を欠いていると思います。あなたはプログラマーです。必要な機能が存在しない場合は作成することができます。 – Telemachus

+0

いいえ、私はポイントを見逃していません:)。私は完全に理解しています。私はアプリケーションに可能な限り小さなコードを追加したいだけです。私の場合は、そのような方法を見つけると、(ソフトウェアエンジニアリングの問題については)より優れています。もしそうでなければ、それは...私は問題ない。私は、あらかじめ定義されたものがあるかどうかを知りたかっただけです。私は怠惰ではない、それはちょうど非常によく世話をする必要があります巨大なアプリケーションにコードを挿入しています。私はちょうどそれを知りたかった....私は自分自身を繰り返すことを望んでいないので。 (DRY - Pragmatic Programmer book:D)から自分自身を繰り返さないでください。 – Clawsy

関連する問題