2009-07-06 10 views
138

Próbuję napisać skrypt, który automatycznie sprawdza lub aktualizuje adres URL Subversion na podstawie tego, czy określony katalog istnieje, czy nie.Jak sprawdzić, czy dany katalog istnieje w Rubim

Z jakiegoś powodu, mój kod nie działa i zawsze zwraca prawdziwą nawet jeśli jest fałszywe:

def directory_exists?(directory) 
    return false if Dir[directory] == nil 
    true 
end 

Co robię źle?

Odpowiedz

238

Jeśli ma znaczenie, czy plik, którego szukasz, to katalog , a nie tylko plik, możesz użyć File.directory? lub Dir.exist?. To zwróci true tylko wtedy, gdy plik istnieje i jest katalogiem.

Na marginesie, bardziej idiomatycznym sposobem napisania tej metody byłoby skorzystanie z faktu, że Ruby automatycznie zwraca wynik ostatniego wyrażenia wewnątrz metody. W ten sposób możesz napisać tak:

def directory_exists?(directory) 
    File.directory?(directory) 
end 

Należy zauważyć, że zastosowanie metody nie jest konieczne w niniejszym przypadku.

+3

Tylko link do doco: http://www.ruby-doc.org/core/classes/File.html#M002555 – Nippysaurus

+110

Po co zawracać sobie głowę umieszczaniem go w innej metodzie? Po prostu zadzwoń bezpośrednio! –

+9

@Radar I doszedłem do wniosku, że uproszczona metoda została najprawdopodobniej uproszczona dla celów pytania i że rzeczywista metoda może zawierać dodatkową logikę. Jeśli żadna inna logika nie wymaga zastosowania metody, zgadzam się. W każdym razie, po prostu uruchom katalog? bezpośrednio. – Emily

15
File.exist?("directory") 

Dir[] zwraca tablicę, więc nigdy nie będzie nil. Jeśli chcesz zrobić to na swój sposób, można zrobić

Dir["directory"].empty? 

który powróci true jeśli nie został znaleziony.

32

Wszystkie pozostałe odpowiedzi są poprawne, ale możesz mieć problemy, jeśli próbujesz sprawdzić katalog w katalogu domowym użytkownika. Upewnij się rozwinąć ścieżkę względną przed kontroli:

File.exists? '~/exists' 
=> false 
File.directory? '~/exists' 
=> false 
File.exists? File.expand_path('~/exists') 
=> true 
29

Można również użyć Dir::exist? tak:

Dir.exist?('Directory Name') 

Returns true jeśli 'Nazwa katalogu' jest katalogiem, false inaczej. 1

+2

To wydaje się wymagać Ruby> 1.9 lub tak, na 1.8 zwraca 'nieokreśloną metodę \" istnieje? dla Dir: Class (NoMethodError) '.Również liczba mnoga jest teraz przestarzała, zamiast tego użyj '.ist?'. –

5

Można użyć Kernel#test:

test ?d, 'some directory' 
+1

Kudo za to. Nie mam pojęcia. Bardzo przydatne, dziękuję! – dimitarvp

+0

To jest miłe. Nie najintensywniej- ekspresywnie, ale schludnie. –

Powiązane problemy