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?

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.


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


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

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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.