ฉันจะรับชื่อไฟล์จากพา ธ ไฟล์ใน Ruby ได้อย่างไร
ตัวอย่างเช่นถ้าฉันมีเส้นทาง"C:\projects\blah.dll"
และฉันต้องการ "blah"
มีLastIndexOf
วิธีการในทับทิมหรือไม่?
ฉันจะรับชื่อไฟล์จากพา ธ ไฟล์ใน Ruby ได้อย่างไร
ตัวอย่างเช่นถ้าฉันมีเส้นทาง"C:\projects\blah.dll"
และฉันต้องการ "blah"
มีLastIndexOf
วิธีการในทับทิมหรือไม่?
คำตอบ:
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
ฉันไม่ได้เป็นผู้ใช้ Windows มานาน แต่ Pathname rdoc บอกว่าไม่มีปัญหากับตัวคั่นชื่อไดเรกทอรีบน Windows
pathname
งานได้กับชื่อพา ธ ในท้องถิ่นในขณะที่File
สมมติว่าชื่อพา ธ แบบ Unix (แตกต่างกันคือพา ธ และตัวคั่นไดรฟ์ที่ใช้ใน MS Windows เป็นต้น)
ลอง File.basename
ส่งคืนองค์ประกอบสุดท้ายของชื่อไฟล์ที่กำหนดใน file_name ซึ่งจะต้องเกิดขึ้นโดยใช้เครื่องหมายทับซ้าย (`` / '') โดยไม่คำนึงถึงตัวคั่นที่ใช้ในระบบไฟล์โลคัล หากกำหนดส่วนต่อท้ายและแสดงที่ท้ายไฟล์ file_name จะถูกลบออก
File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb" File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
ในกรณีของคุณ:
File.basename("C:\\projects\\blah.dll", ".dll") #=> "blah"
Pathname.new("some/path/to/my.file").basename
และได้รับmy.file/
: '(
File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
อะไร
ในกรณีที่ไม่รู้จักนามสกุล (มันต้องการ / คั่น):
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ตอบได้อย่างสมบูรณ์แบบ แต่มีบางสิ่งที่ไม่มีคำตอบที่กล่าวถึงที่นี่ แทนที่จะใช้File::extname
คุณสามารถใช้ a '.*'
เพื่อรับชื่อไฟล์ได้โดยตรง
File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
แต่ถ้าคุณต้องการได้รับชื่อไฟล์พื้นฐานของไฟล์นามสกุลเฉพาะคุณก็ต้องใช้File::extname
มิเช่นนั้น
คำตอบของ Jonathon นั้นดีกว่า แต่เพื่อให้คุณรู้ว่าsomelist[-1]
เป็นหนึ่งในLastIndexOf
สัญลักษณ์ที่มีอยู่
ดังที่ krusty.ar พูดถึงsomelist.last
ชัดเกินไป
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"
โปรดทราบว่าสตริงอัญประกาศคู่หนี \ 's
'C:\projects\blah.dll'.split('\\').last
File.basename
คุณก็สามารถ และเช่นเดียวกับคำตอบอื่น ๆ ไม่ตอบคำถามของ OP
หากคุณมีการเข้าถึงตัวแปร ENV scan
รวมกับ regex เล็กน้อยนี้ (ซึ่งค้นหาคำสุดท้าย แต่หนึ่งคำเป็นจุดแล้วคำสุดท้ายของสตริง) จะใส่ชื่อของไฟล์ลงใน 'ชื่อไฟล์':
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
เห็นได้ชัดว่าคุณสามารถใช้scan
และ regex สำหรับชื่อพา ธ ใด ๆ ที่มีชื่อไฟล์และ__FILE__
เป็นตัวเลือกที่ชัดเจน:
__FILE__.scan(/\w+\.\w+$/)