Jak sprawdzić, czy podany katalog istnieje w Rubim

163

Próbuję napisać skrypt, który automatycznie pobiera lub aktualizuje adres URL Subversion na podstawie tego, czy określony katalog istnieje, czy nie.

Z jakiegoś powodu mój kod nie działa i zawsze zwraca wartość true, nawet jeśli jest fałszywa:

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

Co ja robię źle?

Popiół
źródło

Odpowiedzi:

287

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

Na marginesie, bardziej idiomatycznym sposobem napisania metody byłoby wykorzystanie faktu, że Ruby automatycznie zwraca wynik ostatniego wyrażenia wewnątrz metody. Możesz więc napisać to tak:

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

Należy zauważyć, że w tym przypadku użycie metody nie jest konieczne.

Emilia
źródło
139
Po co zawracać sobie głowę umieszczaniem go w innej metodzie? Po prostu zadzwoń bezpośrednio!
Ryan Bigg
11
@Radar Doszedłem do wniosku, że uproszczona metoda została prawdopodobnie uproszczona na potrzeby tego pytania i że rzeczywista metoda może zawierać dodatkową logikę. Zgadzam się, jeśli żadna inna logika nie wymaga zastosowania tej metody. Jak najbardziej, po prostu uruchom katalog? bezpośrednio.
Emily,
4
Nie Dir.exists?nie być czystsze niż File.directory??
Yo Ludke
3
Dir.exists?jest przestarzały, użyjDir.exist
fkoessler
4
@burningpony mój zły, to jestDir.exist?
fkoessler
42

Możesz również użyć w ten Dir::exist?sposób:

Dir.exist?('Directory Name')

Zwraca, truejeśli „Nazwa katalogu” to katalog, w falseprzeciwnym razie. 1

ma11hew28
źródło
2
Wydaje się, że wymaga to Ruby> 1,9 lub więcej, na 1.8 zwraca undefined method `exists?' for Dir:Class (NoMethodError). Ponadto forma liczby mnogiej jest teraz przestarzała, użyj .exist?zamiast niej.
Josip Rodin
40

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

File.exists? '~/exists'
=> false
File.directory? '~/exists'
=> false
File.exists? File.expand_path('~/exists')
=> true
Andrzej
źródło
18
File.exist?("directory")

Dir[]zwraca tablicę, więc nigdy nie będzie nil. Jeśli chcesz to zrobić po swojemu, możesz to zrobić

Dir["directory"].empty?

który zwróci, truejeśli nie zostanie znaleziony.

chmurka
źródło
7

Możesz użyć Kernel#test:

test ?d, 'some directory'

pobiera swoje źródła z https://ss64.com/bash/test.html zauważysz, że bash testma tę flagę -ddo sprawdzenia, czy katalog istnieje -d file True if file is a Directory. [[ -d demofile ]]

jtzero
źródło
1
To jest fajne. Nie od razu wyrazisty , ale schludny.
kayleeFrye_onDeck