Làm cách nào để kiểm tra xem một thư mục đã cho có tồn tại trong Ruby không


163

Tôi đang cố gắng viết một tập lệnh tự động kiểm tra hoặc cập nhật URL Subversion dựa trên việc thư mục được chỉ định có tồn tại hay không.

Vì một số lý do, mã của tôi không hoạt động và luôn trả về đúng ngay cả khi nó sai:

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

Tôi đang làm gì sai?

Câu trả lời:


287

Nếu vấn đề là tệp bạn đang tìm có phải là thư mục không chỉ là tệp, bạn có thể sử dụng File.directory?hoặc Dir.exist?. Điều này sẽ trả về true chỉ khi tập tin tồn tại và là một thư mục.

Bên cạnh đó, một cách đơn giản hơn để viết phương thức sẽ là lợi dụng thực tế là Ruby tự động trả về kết quả của biểu thức cuối cùng bên trong phương thức. Vì vậy, bạn có thể viết nó như thế này:

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

Lưu ý rằng sử dụng một phương pháp là không cần thiết trong trường hợp hiện tại.


139
Tại sao thậm chí bận tâm đặt nó bên trong một phương pháp khác? Chỉ cần gọi trực tiếp!
Ryan Bigg

11
@Radar Tôi hình dung rằng phương pháp loại bỏ có khả năng được đơn giản hóa cho mục đích của câu hỏi và phương pháp thực tế có thể chứa một số logic bổ sung. Nếu không có logic khác cần phải đi trong phương thức, tôi đồng ý. Bằng mọi cách, chỉ cần chạy thư mục? trực tiếp
Emily

4
Sẽ không Dir.exists?sạch hơn File.directory??
Yo Ludke

3
Dir.exists?không được dùng nữa, hãy sử dụngDir.exist
fkoessler

4
@burningpony xấu của tôi, đó làDir.exist?
fkoessler

42

Bạn cũng có thể sử dụng Dir::exist?như vậy:

Dir.exist?('Directory Name')

Trả về truenếu 'Tên thư mục' là một thư mục, falsenếu không. 1


2
Điều này dường như yêu cầu Ruby> 1.9 hoặc hơn, vào ngày 1.8, nó trả về undefined method `exists?' for Dir:Class (NoMethodError). Ngoài ra, hình thức số nhiều bây giờ không được dùng nữa, .exist?thay vào đó hãy sử dụng .
Josip Rodin

40

Tất cả các câu trả lời khác đều đúng, tuy nhiên, bạn có thể gặp vấn đề nếu bạn đang cố kiểm tra thư mục trong thư mục nhà của người dùng. Hãy chắc chắn rằng bạn mở rộng đường dẫn tương đối trước khi kiểm tra:

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

18
File.exist?("directory")

Dir[]trả về một mảng, vì vậy nó sẽ không bao giờ có nil. Nếu bạn muốn làm theo cách của bạn, bạn có thể làm

Dir["directory"].empty?

Nó sẽ trở lại truenếu nó không được tìm thấy.


7

Bạn có thể sử dụng Kernel#test:

test ?d, 'some directory'

nó có nguồn gốc từ https://ss64.com/bash/test.html bạn sẽ thấy bash testcó cờ này -dđể kiểm tra nếu một thư mục tồn tại -d file True if file is a Directory. [[ -d demofile ]]


1
Đây là gọn gàng. Không phải là biểu cảm ngay lập tức nhất , nhưng gọn gàng.
kayleeFrye_onDeck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.