So überprüfen Sie, ob in Ruby ein bestimmtes Verzeichnis vorhanden ist

163

Ich versuche, ein Skript zu schreiben, das eine Subversion-URL automatisch auscheckt oder aktualisiert, je nachdem, ob ein bestimmtes Verzeichnis vorhanden ist oder nicht.

Aus irgendeinem Grund funktioniert mein Code nicht und gibt immer true zurück , auch wenn er false ist:

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

Was mache ich falsch?

Asche
quelle

Antworten:

287

Wenn es darauf ankommt, ob die gesuchte Datei ein Verzeichnis und nicht nur eine Datei ist, können Sie File.directory?oder verwendenDir.exist? . Dies gibt nur dann true zurück, wenn die Datei vorhanden ist und ein Verzeichnis ist.

Abgesehen davon wäre eine idiomatischere Art, die Methode zu schreiben, die Tatsache auszunutzen, dass Ruby automatisch das Ergebnis des letzten Ausdrucks innerhalb der Methode zurückgibt. Sie könnten es also so schreiben:

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

Beachten Sie, dass im vorliegenden Fall die Verwendung einer Methode nicht erforderlich ist.

Emily
quelle
139
Warum sollte man sich überhaupt die Mühe machen, es in eine andere Methode zu stecken? Rufen Sie es einfach direkt an!
Ryan Bigg
11
@Radar Ich stellte fest, dass die abgespeckte Methode für den Zweck der Frage wahrscheinlich vereinfacht wurde und dass die eigentliche Methode möglicherweise zusätzliche Logik enthält. Wenn keine andere Logik in die Methode einfließen muss, stimme ich zu. Auf jeden Fall nur Verzeichnis ausführen? direkt.
Emily
4
Wäre nicht Dir.exists?nicht sauberer als File.directory??
Yo Ludke
3
Dir.exists?ist veraltet, benutzeDir.exist
fkoessler
4
@ Burningpony mein schlechtes, es istDir.exist?
fkoessler
42

Sie können auch Dir::exist?wie folgt verwenden:

Dir.exist?('Directory Name')

Gibt zurück, truewenn der 'Verzeichnisname' falseandernfalls ein Verzeichnis ist . 1

ma11hew28
quelle
2
Dies scheint Ruby> 1.9 oder so zu erfordern, auf 1.8 wird es zurückgegeben undefined method `exists?' for Dir:Class (NoMethodError). Auch die Pluralform ist jetzt veraltet, verwenden Sie .exist?stattdessen.
Josip Rodin
40

Alle anderen Antworten sind korrekt. Möglicherweise treten jedoch Probleme auf, wenn Sie versuchen, das Verzeichnis im Home-Verzeichnis eines Benutzers zu überprüfen. Stellen Sie sicher, dass Sie den relativen Pfad erweitern, bevor Sie Folgendes überprüfen:

File.exists? '~/exists'
=> false
File.directory? '~/exists'
=> false
File.exists? File.expand_path('~/exists')
=> true
Andrew
quelle
18
File.exist?("directory")

Dir[]Gibt ein Array zurück, so dass es niemals sein wird nil. Wenn Sie es auf Ihre Weise tun möchten, können Sie es tun

Dir["directory"].empty?

welches zurückkehren wird, truewenn es nicht gefunden wurde.

Wolkenkopf
quelle
7

Sie könnten verwenden Kernel#test:

test ?d, 'some directory'

Es hat seinen Ursprung in https://ss64.com/bash/test.html. Sie werden feststellen, dass bash testdieses Flag hat -d, um zu testen, ob ein Verzeichnis vorhanden ist -d file True if file is a Directory. [[ -d demofile ]]

jtzero
quelle
1
Das ist ordentlich. Nicht das unmittelbar ausdrucksvollste , aber ordentlich.
KayleeFrye_onDeck