2011-02-04 18 views
51

Có cách nào để phát hiện nếu thư mục/tệp/liên kết tượng trưng/v.v. thực thể (tổng quát hơn) tồn tại?Cách kiểm tra xem một thư mục/tập tin/liên kết tượng trưng có tồn tại với một lệnh trong Ruby

Tôi cần một hàm duy nhất vì tôi cần kiểm tra một loạt các đường dẫn có thể là các thư mục, tệp hoặc liên kết tượng trưng. Tôi biết File.exists?"file_path" hoạt động cho các thư mục và tệp nhưng không hoạt động đối với các liên kết tượng trưng (là File.symlink?"symlink_path").

+1

Bạn đang sử dụng phiên bản Ruby nào? File tồn tại? làm việc cho các liên kết tượng trưng cho tôi trong Ruby 1.9.2 trong OS X 10.6.6 –

+1

Để làm rõ: đối với các liên kết tượng trưng, ​​bạn đang yêu cầu một cái gì đó trả về 'true' nếu liên kết tượng trưng tồn tại, bất kể nó có thể được giải quyết cuối cùng không -symlink. I E. nó sẽ trả về 'true' cho các liên kết bị hỏng. 'File.exists?' Sẽ chỉ trả về 'true' cho một liên kết tượng trưng không bị hỏng. – Kelvin

Trả lời

102

Các module File tiêu chuẩn có thường file tests sẵn:

RUBY_VERSION # => "1.9.2" 
bashrc = ENV['HOME'] + '/.bashrc' 
File.exist?(bashrc) # => true 
File.file?(bashrc) # => true 
File.directory?(bashrc) # => false 

Bạn sẽ có thể tìm thấy những gì bạn muốn ở đó.


OP: "Cảm ơn nhưng tôi cần cả ba đúng hay sai"

Rõ ràng là không. Ok, hãy thử một cái gì đó như:

def file_dir_or_symlink_exists?(path_to_file) 
    File.exist?(path_to_file) || File.symlink?(path_to_file) 
end 

file_dir_or_symlink_exists?(bashrc)       # => true 
file_dir_or_symlink_exists?('/Users')       # => true 
file_dir_or_symlink_exists?('/usr/bin/ruby')     # => true 
file_dir_or_symlink_exists?('some/bogus/path/to/a/black/hole') # => false 
+0

Tôi khuyên bạn không nên làm nối chuỗi thô ('ENV [ 'HOME'] + '/ .bashrc'') có thể không hoạt động trên nhiều nền tảng. Bạn nên sử dụng Ruby File join và cũng tại sao không bắt đầu từ 'Rails.root' nếu bạn đang sử dụng Rails. 'File.exists? (Rails.root.join ('db', 'my_seeds.csv ') ' –

+1

Nó được đảm bảo không hoạt động đa nền tảng vì Windows không biết về Bash, và do đó, về .bashrc. Nhưng nó hoạt động trên nền tảng * nix. Tuy nhiên, việc sử dụng '/' không phải là vấn đề, vì [IO của Ruby tự động chuyển đổi từ dấu gạch chéo về phía trước thành dấu gạch chéo ngược trên Windows] (http://ruby-doc.org/core-2.3.3/IO.html). –

11

Tại sao không xác định chức năng của riêng bạn File.exists?(path) or File.symlink?(path) và sử dụng?

+0

Tất nhiên tôi có thể làm điều đó, nhưng tôi muốn một cách đã được thực hiện có thể kiểm tra cả hai. Tôi có nghĩa là để kiểm tra xem nếu con đường đó có 'cái gì đó'. – Clawsy

+1

@Clawsy Tôi nghĩ rằng bạn đang thiếu điểm Gintautas: bạn là một lập trình viên - nếu chức năng bạn cần không tồn tại, bạn có thể tạo nó. – Telemachus

+0

Không, tôi không bỏ lỡ điểm :). Tôi hiểu hoàn toàn. Tôi chỉ muốn thêm ít mã nhất có thể vào đơn đăng ký của mình. Trong trường hợp của tôi, nó là tốt hơn (cho các vấn đề kỹ thuật phần mềm) nếu tôi tìm thấy một phương pháp như thế. Nếu không, đó là ... tôi làm cho một, không có vấn đề. Tôi chỉ muốn biết nếu có một xác định trước. Tôi không lười biếng, nó chỉ cần chèn một mã trong một ứng dụng HUGE mà phải được chăm sóc rất tốt. Tôi chỉ muốn biết rằng .... bởi vì tôi không muốn lặp lại bản thân mình. (DRY - Không lặp lại chính mình, từ cuốn sách Lập trình thực dụng: D). – Clawsy

Các vấn đề liên quan