วิธีรับชื่อไฟล์โดยไม่มีนามสกุลจากพา ธ ไฟล์ใน Ruby


233

ฉันจะรับชื่อไฟล์จากพา ธ ไฟล์ใน Ruby ได้อย่างไร

ตัวอย่างเช่นถ้าฉันมีเส้นทาง"C:\projects\blah.dll"และฉันต้องการ "blah"

มีLastIndexOfวิธีการในทับทิมหรือไม่?


3
โปรดทราบว่าไม่มีอะไรพิเศษเกี่ยวกับจุดตามด้วยอักขระ (สามหรือสาม) ตัว พวกเขาเป็นส่วนหนึ่งของชื่อไฟล์ ระบบปฏิบัติการบางระบบคิดว่ามีบางอย่างที่พิเศษเกี่ยวกับส่วนของชื่อไฟล์นั้น แต่คุณไม่ควรตกหลุมพรางนั้น
James Moore

คำตอบ:


94
require 'pathname'

Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>

ฉันไม่ได้เป็นผู้ใช้ Windows มานาน แต่ Pathname rdoc บอกว่าไม่มีปัญหากับตัวคั่นชื่อไดเรกทอรีบน Windows


86
ฉันไม่รู้ว่าทำไมนี่คือคำตอบอันดับ # 1 เมื่อ File.basename ไม่ต้องการ 'ชื่อ' พา ธ 'เพิ่มเติม
GroovyCakes

11
คลาสใช้pathnameงานได้กับชื่อพา ธ ในท้องถิ่นในขณะที่Fileสมมติว่าชื่อพา ธ แบบ Unix (แตกต่างกันคือพา ธ และตัวคั่นไดรฟ์ที่ใช้ใน MS Windows เป็นต้น)
nimrodm

3
แม้จะได้รับการยอมรับจาก OP แต่คำตอบนี้ไม่ได้ตอบคำถามของ OP ดูคำตอบของ Jonathan Lonowski และ Arup Rakshit
GSnyder

6
นามสกุลจะปรากฏถ้ามี คำตอบนั้นผิด
Ludovic Kuty

4
โปรดอย่าทำลายโพสต์ของคุณเอง ขอบคุณ!
NobodyNada

586

ลอง 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"

ด้วย Linux และ Ruby 1.8 ฉันลองPathname.new("some/path/to/my.file").basenameและได้รับmy.file/: '(
java.is.for.desktop

67
โดยทั่วไปมากขึ้นFile.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
kelloti

คำตอบควรเพิ่มโซลูชันของ @kelloti ซึ่งดีกว่า
ymoreau

@kelloti: เกี่ยวกับ/my/file.tar.gzอะไร
Richard-Degenne

56

ในกรณีที่ไม่รู้จักนามสกุล (มันต้องการ / คั่น):

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 () คือคำตอบ!
sivabudh

26

Jonathan Lonowskiตอบได้อย่างสมบูรณ์แบบ แต่มีบางสิ่งที่ไม่มีคำตอบที่กล่าวถึงที่นี่ แทนที่จะใช้File::extnameคุณสามารถใช้ a '.*'เพื่อรับชื่อไฟล์ได้โดยตรง

File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"

แต่ถ้าคุณต้องการได้รับชื่อไฟล์พื้นฐานของไฟล์นามสกุลเฉพาะคุณก็ต้องใช้File::extnameมิเช่นนั้น



8

คำตอบของ 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"

1
ปัญหาที่คุณต้องรู้ว่ามันเป็นแบ็กสแลชหรือฟอร์เวิร์ดสแลช
Joseph Le Brech

4

โปรดทราบว่าสตริงอัญประกาศคู่หนี \ 's

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

5
ปฏิบัติกับมันอย่างหมดจดเป็นสตริงแทนที่จะเป็นเส้นทางทำให้รหัสพกพาน้อย
boatcoder

นี่เป็นวิธีที่ซับซ้อนกว่าที่ต้องการและเป็น Windows โดยเฉพาะ File.basenameคุณก็สามารถ และเช่นเดียวกับคำตอบอื่น ๆ ไม่ตอบคำถามของ OP
Keith Bennett

0

หากคุณมีการเข้าถึงตัวแปร ENV scanรวมกับ regex เล็กน้อยนี้ (ซึ่งค้นหาคำสุดท้าย แต่หนึ่งคำเป็นจุดแล้วคำสุดท้ายของสตริง) จะใส่ชื่อของไฟล์ลงใน 'ชื่อไฟล์':

filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)

เห็นได้ชัดว่าคุณสามารถใช้scanและ regex สำหรับชื่อพา ธ ใด ๆ ที่มีชื่อไฟล์และ__FILE__เป็นตัวเลือกที่ชัดเจน:

__FILE__.scan(/\w+\.\w+$/)

-5

คุณสามารถขอเส้นทางไดเรกทอรีไปยังสคริปต์ปัจจุบันด้วย:

File.dirname __FILE__

คำถามที่ไม่ได้เกี่ยวกับเส้นทางที่มันเป็นเกี่ยวกับชื่อไฟล์ "ฉันจะรับชื่อไฟล์จากพา ธ ไฟล์ใน Ruby ได้อย่างไร"
fontno

นั่นคือ:File.basename __FILE__
ซามูเอล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.