Come verificare se esiste una determinata directory in Ruby


163

Sto cercando di scrivere uno script che verifichi o aggiorni automaticamente un URL Subversion in base all'esistenza o meno di una directory specificata.

Per qualche motivo, il mio codice non funziona e restituisce sempre vero anche se è falso:

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

Che cosa sto facendo di sbagliato?

Risposte:


287

Se è importante che il file che stai cercando sia una directory e non solo un file, puoi usarlo File.directory?o Dir.exist?. Questo restituirà vero solo se il file esiste ed è una directory.

A parte questo, un modo più idiomatico di scrivere il metodo sarebbe quello di sfruttare il fatto che Ruby restituisce automaticamente il risultato dell'ultima espressione all'interno del metodo. Quindi, potresti scriverlo in questo modo:

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

Si noti che l'utilizzo di un metodo non è necessario nel presente caso.


139
Perché preoccuparsi di inserirlo anche in un altro metodo? Chiamalo direttamente!
Ryan Bigg,

11
@Radar Ho pensato che il metodo ridotto fosse probabilmente semplificato ai fini della domanda e che il metodo effettivo potesse contenere qualche logica aggiuntiva. Se nessun'altra logica deve seguire il metodo, sono d'accordo. Certamente, basta eseguire directory? direttamente.
Emily,

4
Non Dir.exists?sarebbe più pulito di File.directory??
Yo Ludke,

3
Dir.exists?è obsoleto, utilizzareDir.exist
fkoessler il

4
@burningpony il mio male, èDir.exist?
fkoessler

42

Puoi anche usare Dir::exist?così:

Dir.exist?('Directory Name')

Restituisce truese il "Nome directory" è una directory, falsealtrimenti. 1


2
Questo sembra richiedere Ruby> 1.9 o giù di lì, su 1.8 ritorna undefined method `exists?' for Dir:Class (NoMethodError). Inoltre, la forma plurale è ora deprecata, utilizzare .exist?invece.
Josip Rodin,

40

Tutte le altre risposte sono corrette, tuttavia, potresti avere problemi se stai cercando di controllare la directory nella home directory di un utente. Assicurati di espandere il percorso relativo prima di controllare:

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

18
File.exist?("directory")

Dir[]restituisce un array, quindi non lo sarà mai nil. Se vuoi farlo a modo tuo, potresti farlo

Dir["directory"].empty?

che tornerà truese non fosse stato trovato.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.