2015-09-30 15 views
8

Tôi có một mảng của Strings và tôi muốn chỉ chọn những Strings mà là đường dẫn đến tập tin:Làm thế nào để kiểm tra xem một tập tin tồn tại

con đường của tôi là "~/dlds/some_file.ics" nơi ~/dlds là một liên kết tượng trưng đến ~/archive/downloads trên hệ thống của tôi. Các tập tin có quyền truy cập sau đây:

-rw-r--r-- 

Mã của tôi (Tôi đã thử nhiều biến thể):

ARGV.select do |string| 
    File.file? string # returns false 
    Pathname.new(string).file? # returns false 
    Pathname.new(string).expand_path.file? # returns false 
end 

Tôi không biết những gì khác để thử.

Tôi đang chạy Ruby 2.2.0 hoặc 2.2.2.

+0

Hiển thị 'ARGV' của bạn, vui lòng –

+1

Tôi nghĩ lý do nằm trong thư mục' ~/'. Để kiểm tra nó cố gắng vượt qua đường dẫn đầy đủ nghĩa là '/ home/user/dlds/some_file.ics' –

+0

ARGV:' ["--debug", "~/dlds/some_file"] '. Sử dụng đường dẫn đầy đủ cũng không hoạt động .. – musicmatze

Trả lời

15
File.exist? File.expand_path "~/dlds/some_file.ics" 
+3

lưu ý điều này trả về true nếu đường dẫn cũng là một thư mục. chi tiết tại đây: http://stackoverflow.com/questions/8590098/ruby-function-to-check-file-existence – Crashalot

0

Tôi nghĩ File.readlink là những gì bạn đang tìm kiếm

Trả về tên của tập tin tham chiếu bởi các liên kết nhất định. Không phải có sẵn trên tất cả các nền tảng.

File.readlink("path/to/symlink") 
+0

Kết quả trong 'Errno :: ENOENT: Không có tệp hoặc thư mục như vậy @ rb_readlink - ~/dlds/some_file' – musicmatze

+0

Điều này sẽ hoạt động. Từ lỗi bạn cho thấy bạn đã cung cấp tên tệp không chính xác. – nathanvda

+0

Tên tệp được tự động hoàn thành khi tôi thử trong irb, vì vậy không, tôi biết rằng tệp tồn tại và đường dẫn là chính xác. – musicmatze

2

Câu hỏi của bạn là một chút bối rối. Nếu bạn muốn kiểm tra nếu tập tin tồn tại, bạn chỉ nên làm như bạn đã làm:

Pathname.new(file_name).file? 

Nếu bạn đang sử dụng ~ đầu tiên bạn sẽ phải mở rộng con đường, vì vậy viết:

Pathname.new(file_name).expand_path.file? 

Nếu bạn muốn kiểm tra nếu được file_name là một liên kết tượng trưng, ​​bạn chỉ có thể làm

Pathname.new(file_name).expand_path.symlink? 

Nếu bạn muốn tìm các tập tin các điểm liên kết tượng trưng đến, bạn phải tuân theo liên kết:

File.readlink(Pathname.new(file_name).expand_path) 

đó sẽ trở lại với tên tập tin của tập tin liên kết, vì vậy nếu bạn thực sự muốn bạn có thể làm một cái gì đó như:

Pathname.new(File.readlink(Pathname.new(file_name).expand_path)).file? 

để đảm bảo các liên kết tượng trưng được trỏ đến một tập tin hiện có.

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