2011-02-04 13 views
51

Czy istnieje jeden sposób wykrywania, czy katalog/plik/dowiązanie symboliczne/etc. podmiot (bardziej ogólny) istnieje?Jak sprawdzić, czy istnieje katalog/plik/dowiązanie symboliczne z jednym poleceniem w Ruby

Potrzebuję jednej funkcji, ponieważ muszę sprawdzić tablicę ścieżek, które mogą być katalogami, plikami lub dowiązaniami symbolicznymi. Wiem, że File.exists?"file_path" działa dla katalogów i plików, ale nie dla dowiązań symbolicznych (co jest File.symlink?"symlink_path").

+1

Jaką wersję Ruby używasz? Plik istnieje? działa dla dowiązań symbolicznych dla mnie w Rubim 1.9.2 w OS X 10.6.6 –

+1

Aby wyjaśnić: dla dowiązań symbolicznych, pytasz o coś, co zwraca 'true', jeśli istnieje dowiązanie symboliczne, niezależnie od tego, czy może ono ostatecznie zostać rozwiązane -symlink. To znaczy. powinien także zwracać "true" dla uszkodzonych linków. 'File.exists?' Zwróci tylko 'true' dla dowiązania symbolicznego, które nie jest zepsute. – Kelvin

Odpowiedz

102

Standardowy moduł Plik ma zwykle file tests dostępne:

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

Powinieneś być w stanie znaleźć to, co chcesz tam.


OP: "Dzięki, ale muszę wszystkich trzech prawda czy fałsz"

nie

Oczywiście. OK, wypróbuj coś takiego:

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

Odradzam robienie ciągłego łączenia ciągów ('ENV [ 'HOME'] + '/ .bashrc''), który może nie działać między platformami. Powinieneś używać sprzężeń w Ruby File, a także dlaczego nie uruchamiać z 'Rails.root' jeśli używasz Rails. 'File.exists? (Rails.root.join ('db', 'my_seeds.csv ') ' –

+1

Gwarantuje to, że nie będzie działać na wielu platformach, ponieważ system Windows nie wie o Bash, a tym samym o .bashrc. Ale działałby na platformie opartej na * nix. Używanie '/' nie jest jednak problemem, ponieważ [IO Ruby automatycznie konwertuje z ukośników do ukośników w systemie Windows] (http://ruby-doc.org/core-2.3.3/IO.html). –

11

Dlaczego nie zdefiniować własnej funkcji File.exists?(path) or File.symlink?(path) i używać?

+0

Oczywiście, że mogę to zrobić, ale chciałbym mieć już wdrożoną metodę sprawdzania obu. Chcę sprawdzić, czy na tej ścieżce jest "coś". – Clawsy

+1

@ Clawsy Myślę, że brakuje ci punktu Gintautasa: jesteś programistą - jeśli potrzebna funkcja nie istnieje, możesz ją utworzyć. – Telemachus

+0

Nie, nie brakuje mi punktu :). Rozumiem perfekcyjnie. Chcę tylko dodać jak najmniej kodu do mojej aplikacji. W moim przypadku jest lepiej (dla inżynierii oprogramowania), jeśli znajdę taką metodę. Jeśli nie, to jest ... Robię jedno, nie ma problemu. Chciałem tylko wiedzieć, czy istnieje predefiniowany. Nie jestem leniwy, to tylko wstawianie kodu w OGROMNEJ aplikacji, która musi być bardzo dobrze zaopiekowała się. Po prostu chciałem to wiedzieć ... ponieważ nie chcę się powtarzać. (DRY - Do not Repeat Yourself, z książki Pragmatic Programmer: D). – Clawsy

Powiązane problemy