Cách lấy tên tệp mà không cần mở rộng từ đường dẫn tệp trong Ruby


233

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 LastIndexOfphương pháp trong Ruby?


3
Hãy nhớ rằng không có gì đặc biệt về một dấu chấm theo sau bởi một số (ba, có lẽ) nhân vật. Chúng là một phần của tên của tệp. Một số hệ điều hành bên lề nghĩ rằng có một cái gì đó đặc biệt về phần đó của tên tệp, nhưng bạn không nên rơi vào cái bẫy đó.
James Moore

Câu trả lời:


94
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.


86
Tôi không biết tại sao đây là câu trả lời được xếp hạng số 1 khi File.basename không yêu cầu thêm 'yêu cầu' của 'tên đường dẫn'.
GroovyCakes

11
Lớp pathnamehoạt động với tên đường dẫn cục bộ trong khi Fileluô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)
nimrodm

3
Mặc dù được OP chấp nhận, câu trả lời này không thực sự trả lời câu hỏi của OP. Xem câu trả lời của Jonathan Lonowski và Arup Rakshit.
GSnyder

6
Phần mở rộng có mặt nếu có. Câu trả lời là sai.
Ludovic Kuty

4
Xin đừng phá hoại bài viết của riêng bạn. Cảm ơn!
NobodyNada

586

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"

Với Linux và Ruby 1.8, tôi thử Pathname.new("some/path/to/my.file").basenamevà nhận my.file/: '(
java.is.for.desktop

67
Tổng quát hơn,File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
kelloti

Câu trả lời nên được thêm vào giải pháp của @kelloti thì tốt hơn.
ymoreau

@kelloti: Thế còn /my/file.tar.gz?
Richard-Degenne

56

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"

5
File.basename () là câu trả lời!
sivabudh

26

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.


13

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" 

8

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 LastIndexOfký hiệu có sẵn.

Như krusty.ar đã đề cập somelist.lastrõ 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"

1
vấn đề với điều đó là bạn cần biết đó là dấu gạch chéo ngược hay chuyển tiếp
Joseph Le Brech

4

Lưu ý rằng dấu ngoặc kép thoát chuỗi.

'C:\projects\blah.dll'.split('\\').last

5
Xử lý nó hoàn toàn như một chuỗi, chứ không phải là một đường dẫn, làm cho mã ít di động hơn.
thuyền viên

Đây là cách phức tạp hơn mức cần thiết và dành riêng cho Windows. Bạn có thể chỉ 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.
Keith Bennett

0

Nếu bạn có quyền truy cập vào các biến ENV, scankế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 scanvà 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+$/)

-5

Bạn có thể nhận đường dẫn thư mục đến tập lệnh hiện tại với:

File.dirname __FILE__

Câu hỏi không phải là về đường dẫn, mà là về tên tệp . "Làm cách nào tôi có thể lấy tên tệp từ đường dẫn tệp trong Ruby?"
fontno

Đó sẽ là:File.basename __FILE__
Samuel
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.