Cara memeriksa apakah direktori yang diberikan ada di Ruby

163

Saya mencoba menulis skrip yang secara otomatis memeriksa atau memperbarui URL Subversion berdasarkan pada apakah direktori yang ditentukan ada atau tidak.

Untuk beberapa alasan, kode saya tidak berfungsi dan selalu mengembalikan true walaupun itu salah:

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

Apa yang saya lakukan salah?

Abu
sumber

Jawaban:

287

Jika penting apakah file yang Anda cari adalah direktori dan bukan hanya file, Anda bisa menggunakan File.directory?atauDir.exist? . Ini akan mengembalikan true hanya jika file tersebut ada dan merupakan direktori.

Selain itu, cara yang lebih idiomatis untuk menulis metode adalah dengan memanfaatkan fakta bahwa Ruby secara otomatis mengembalikan hasil dari ekspresi terakhir di dalam metode. Jadi, Anda bisa menulis seperti ini:

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

Perhatikan bahwa menggunakan metode tidak perlu dalam kasus ini.

Emily
sumber
139
Mengapa repot-repot memasukkannya ke dalam metode lain? Sebut saja secara langsung!
Ryan Bigg
11
@ Radar Saya menemukan bahwa metode stripped-down kemungkinan disederhanakan untuk tujuan pertanyaan dan bahwa metode aktual mungkin mengandung beberapa logika tambahan. Jika tidak ada logika lain yang diperlukan dalam metode ini, saya setuju. Dengan segala cara, jalankan saja direktori? langsung.
Emily
4
Tidak akan Dir.exists?tidak bersih dari File.directory??
Yo Ludke
3
Dir.exists?sudah usang, gunakanDir.exist
fkoessler
4
@burningpony my bad, it'sDir.exist?
fkoessler
42

Anda juga dapat menggunakan Dir::exist?seperti ini:

Dir.exist?('Directory Name')

Kembali truejika 'Nama Direktori' adalah direktori, falsejika tidak. 1

ma11hew28
sumber
2
Ini tampaknya membutuhkan Ruby> 1,9 atau lebih, pada 1,8 ia kembali undefined method `exists?' for Dir:Class (NoMethodError). Juga, bentuk jamak sekarang sudah usang, gunakan .exist?saja.
Josip Rodin
40

Semua jawaban lain benar, namun, Anda mungkin memiliki masalah jika Anda mencoba memeriksa direktori di direktori home pengguna. Pastikan Anda memperluas jalur relatif sebelum memeriksa:

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

Dir[]mengembalikan array, jadi itu tidak akan pernah terjadi nil. Jika Anda ingin melakukannya dengan cara Anda, Anda bisa melakukannya

Dir["directory"].empty?

yang akan kembali truejika tidak ditemukan.

kepala awan
sumber
7

Anda bisa menggunakan Kernel#test:

test ?d, 'some directory'

itu mendapatkan itu berasal dari https://ss64.com/bash/test.html Anda akan melihat bash testmemiliki bendera ini -duntuk menguji apakah ada direktori -d file True if file is a Directory. [[ -d demofile ]]

jtzero
sumber
1
Ini rapi. Bukan yang paling ekspresif , tapi rapi.
kayleeFrye_onDeck