it-swarm.com.de

Wie bekomme ich einen Dateinamen ohne Dateierweiterung aus dem Dateipfad in Ruby

Wie kann ich den Dateinamen aus einem Dateipfad in Ruby abrufen?

Zum Beispiel, wenn ich einen Pfad von "C:\projects\blah.dll" und ich will nur das "bla".

Gibt es eine LastIndexOf Methode in Ruby?

225
dagda1
require 'pathname'

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

Ich war lange Zeit kein Windows-Benutzer, aber der Pfadname rdoc besagt, dass es keine Probleme mit den Trennzeichen für Verzeichnisnamen unter Windows gibt.

93
user46519

Versuchen File.basename

Gibt die letzte in dateiname angegebene Komponente des Dateinamens zurück, die unabhängig vom im lokalen Dateisystem verwendeten Trennzeichen mit Schrägstrichen (``/’’) gebildet werden muss. Wenn das Suffix am Ende von dateiname angegeben und vorhanden ist, wird es entfernt.

File.basename("/home/gumby/work/Ruby.rb")          #=> "Ruby.rb"
File.basename("/home/gumby/work/Ruby.rb", ".rb")   #=> "Ruby"

In Ihrem Fall:

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

Falls die Erweiterung nicht bekannt ist (sie benötigt das/-Trennzeichen):

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"
55
Vinko Vrsalovic

Jonathan Lonowski perfekt beantwortet, aber es gibt etwas, dass keine der hier genannten Antworten. Anstatt File::extname , können Sie direkt ein '.*', um den Dateinamen zu erhalten.

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

Wenn Sie jedoch den Basisdateinamen bestimmter Erweiterungsdateien erhalten möchten, müssen Sie File::extname, sonst nicht.

25
Arup Rakshit

Versuchen Sie diesen Code

Verwenden Sie extname

 File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test" 
11
Rahul Patel

Jonathons Antwort ist besser, aber um Sie wissen zu lassen, somelist[-1] ist eine der verfügbaren LastIndexOf -Notationen.

Wie krusty.ar erwähnt somelist.last anscheinend auch.

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"
7
monkut

Beachten Sie, dass Strings in doppelten Anführungszeichen vor\'s stehen.

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

Wenn Sie Zugriff auf ENV-Variablen haben, setzt scan in Kombination mit diesem kleinen regulären Ausdruck (der das vorletzte Wort, einen Punkt und das letzte Wort der Zeichenfolge findet) den Dateinamen in 'Dateiname':

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

Natürlich können Sie scan und die Regex für jeden Pfadnamen verwenden, der den Dateinamen enthält, und __FILE__ ist die naheliegende Wahl:

__FILE__.scan(/\w+\.\w+$/)
0
Dave Everitt