2011-02-04 20 views
51

Bir dizin/dosya/symlink/etc olup olmadığını tespit etmenin tek bir yolu var mı? varlık (daha genelleştirilmiş) var mıdır?Ruby'de bir komut dizini/dosya/symlink var mı kontrol edin

Tek bir işleve ihtiyacım var, çünkü dizinler, dosyalar ya da sembolik bağlantılar olabilecek bir dizi yolu denetlemem gerekiyor. File.exists?"file_path"'un dizinler ve dosyalar için çalıştığını, ancak sembolik bağlantıların olmadığını biliyorum (File.symlink?"symlink_path").

+1

Hangi sürümü Ruby kullanıyorsunuz? Dosya var? OS X 10.6.6 –

+1

içinde Ruby 1.9.2 içinde benim için simetteler için çalışır Açıklığa kavuşturmak için: Symlinks için, en sonunda bir non olarak çözülemez olup olmadığına bakılmaksızın, sembolik bağlantı varsa, 'true' döndüren bir şey soruyorsunuz -symlink. Yani kırık bağlantılar için 'true' döndürmelidir. 'File.exists?' Sadece kırık olmayan bir link için 'true' döndürecektir. – Kelvin

cevap

102

standart Dosya modülü mevcut zamanki file tests sahiptir:

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

Oraya istediğinizi bulmak mümkün olmalıdır.


OP: Açıkçası

değil "Teşekkürler ama ben her üç doğru veya yanlış gerek." Tamam, bir şey gibi deneyin:

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

Ham dize birleştirme yapmamaya öneriyorum (ENV [ Platformlar arası çalışmayabilecek 'HOME'] + '/ .bashrc'). Rails kullanıyorsanız, Ruby File katılımcılarını kullanmalı ve neden Rails.root'dan başlamamalısınız? File.exists? (Rails.root.join ('db', 'my_seeds.csv ') ' –

+1

Windows dolayısıyla Bash hakkında bilmek ve olmadığından .bashrc hakkında, çapraz platform çalışmıyor için garantisi yoktur. Ama bu bir * nix tabanlı platform üzerinde çalışmak istiyorum. [Ileriye Windows üzerinde eğik çizgi arkaya eğik gelen Ruby'nin IO otomatik dönüştürür] beri 'kullanımı /' olsa sorun değil (http://ruby-doc.org/core-2.3.3/IO.html). –

11

Neden kendi işlevinizi tanımlayamıyorsunuz File.exists?(path) or File.symlink?(path) ve bunu kullanın?

+0

Tabii ki bunu yapabilirim, ancak her ikisini de kontrol edebilecek bir şekilde uygulamak istiyorum. Yani o yolda 'bir şey' olup olmadığını kontrol etmek istiyorum. – Clawsy

+1

@Clawsy Gintautas'ın noktasını kaçırdığınızı düşünüyorum: bir programcıysanız - ihtiyacınız olan işlev yoksa, bunu yaratabilirsiniz. – Telemachus

+0

Hayır, noktayı kaçırmıyorum :). Mükemmel anlıyorum. Uygulamamda mümkün olduğunca az kod eklemek istiyorum. Benim durumumda, böyle bir yöntem bulursam (yazılım mühendisliği meseleleri için) daha iyidir. Eğer değilse, bu ... Bir tane yaparım, sorun değil. Sadece önceden belirlenmiş bir tane olup olmadığını bilmek istedim. Tembel değilim, sadece çok iyi bakılması gereken BÜYÜK bir uygulamada bir kod eklemek. Bunu bilmek istedim .... çünkü kendimi tekrarlamak istemiyorum. (DRY - Kendinizi Tekrar Edinmeyin, Pragmatik Programcı kitabından: D). – Clawsy

İlgili konular