Làm cách nào tôi có thể lấy tên tệp từ đường dẫn tệp trong Ruby?
Ví dụ, nếu tôi có một con đường "C:\projects\blah.dll"
và tôi chỉ muốn "blah".
Có một LastIndexOf
phương pháp trong Ruby?
Làm cách nào tôi có thể lấy tên tệp từ đường dẫn tệp trong Ruby?
Ví dụ, nếu tôi có một con đường "C:\projects\blah.dll"
và tôi chỉ muốn "blah".
Có một LastIndexOf
phương pháp trong Ruby?
Câu trả lời:
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
Tôi đã không phải là người dùng Windows trong một thời gian dài, nhưng Pathocordoc nói rằng nó không có vấn đề gì với các dấu tách tên thư mục trên Windows.
pathname
hoạt động với tên đường dẫn cục bộ trong khi File
luôn giả sử tên đường dẫn Unix (ví dụ: sự khác biệt là đường phân cách ổ đĩa và ổ đĩa được sử dụng trong MS Windows)
Thử File.basename
Trả về thành phần cuối cùng của tên tệp được đưa ra trong file_name, phải được tạo thành bằng cách sử dụng dấu gạch chéo (`` / '') bất kể dấu phân cách được sử dụng trên hệ thống tệp cục bộ. Nếu hậu tố được đưa ra và hiện diện ở cuối file_name, nó sẽ bị xóa.
File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb" File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
Trong trường hợp của bạn:
File.basename("C:\\projects\\blah.dll", ".dll") #=> "blah"
Pathname.new("some/path/to/my.file").basename
và nhận my.file/
: '(
File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
?
Trong trường hợp phần mở rộng không được biết (nó cần / dấu phân cách):
irb(main):024:0> f = 'C:\foobar\blah.txt'.gsub("\\","/")
=> "C:/foobar/blah.txt"
irb(main):027:0> File.basename(f,File.extname(f))
=> "blah"
Jonathan Lonowski đã trả lời hoàn hảo, nhưng có một điều mà không câu trả lời nào được đề cập ở đây. Thay vì File::extname
, bạn có thể trực tiếp sử dụng a '.*'
để lấy tên tệp.
File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
Nhưng, nếu bạn muốn lấy tên tệp cơ sở của bất kỳ tệp mở rộng cụ thể nào , thì bạn cần phải sử dụng File::extname
, nếu không thì không.
Hãy thử mã này
Sử dụng extname
File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test"
Câu trả lời của Jonathon là tốt hơn, nhưng để cho bạn biết somelist[-1]
là một trong những LastIndexOf
ký hiệu có sẵn.
Như krusty.ar đã đề cập somelist.last
rõ ràng là quá.
irb(main):003:0* f = 'C:\\path\\file.txt'
irb(main):007:0> f.split('\\')
=> ["C:", "path", "file.txt"]
irb(main):008:0> f.split('\\')[-1]
=> "file.txt"
Lưu ý rằng dấu ngoặc kép thoát chuỗi.
'C:\projects\blah.dll'.split('\\').last
File.basename
. Và, giống như một số câu trả lời khác, không trả lời câu hỏi của OP.
Nếu bạn có quyền truy cập vào các biến ENV, scan
kết hợp với regex nhỏ này (tìm thấy từ cuối cùng nhưng một từ, dấu chấm, thì từ cuối cùng của chuỗi) sẽ đặt tên của tệp vào 'tên tệp':
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
Rõ ràng, bạn có thể sử dụng scan
và biểu thức chính trên bất kỳ tên đường dẫn nào có chứa tên tệp và __FILE__
là lựa chọn rõ ràng:
__FILE__.scan(/\w+\.\w+$/)