Wie kann ich den Dateinamen aus einem Dateipfad in Ruby abrufen?
Zum Beispiel, wenn ich einen Pfad habe "C:\projects\blah.dll"
und nur das "bla" will.
Gibt es eine LastIndexOf
Methode in Ruby?
Wie kann ich den Dateinamen aus einem Dateipfad in Ruby abrufen?
Zum Beispiel, wenn ich einen Pfad habe "C:\projects\blah.dll"
und nur das "bla" will.
Gibt es eine LastIndexOf
Methode in Ruby?
Antworten:
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
Ich war lange Zeit kein Windows-Benutzer mehr, aber der Pfadname rdoc sagt, dass es unter Windows keine Probleme mit Verzeichnisnamen-Trennzeichen gibt.
pathname
arbeitet mit lokalen Pfadnamen, während File
immer Unix-Pfadnamen angenommen werden (Unterschied sind
Versuchen File.basename
Gibt die letzte Komponente des in Dateiname angegebenen Dateinamens zurück, die unabhängig vom im lokalen Dateisystem verwendeten Trennzeichen mit Schrägstrichen (`` / '') gebildet werden muss. Wenn am Ende von Dateiname ein Suffix 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 deinem Fall:
File.basename("C:\\projects\\blah.dll", ".dll") #=> "blah"
Pathname.new("some/path/to/my.file").basename
ich my.file/
: '(
File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
?
Falls die Erweiterung nicht bekannt ist (sie benötigt das / separator):
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 antwortete perfekt, aber es gibt etwas, das keine der hier genannten Antworten enthält. Stattdessen File::extname
können Sie direkt a verwenden '.*'
, um den Dateinamen abzurufen.
File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
Wenn Sie jedoch den Basisdateinamen einer bestimmten Erweiterungsdatei abrufen möchten, müssen Sie diese verwenden File::extname
, andernfalls nicht.
Versuchen Sie diesen Code
Verwenden extname
File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test"
Jonathons Antwort ist besser, aber Sie wissen zu lassen, somelist[-1]
ist eine der LastIndexOf
verfügbaren Notationen.
Wie krusty.ar somelist.last
anscheinend auch erwähnt.
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"
Beachten Sie, dass Zeichenfolgen in doppelten Anführungszeichen nicht angezeigt werden.
'C:\projects\blah.dll'.split('\\').last
File.basename
. Und beantwortet, wie einige der anderen Antworten, die Frage des OP nicht.
Wenn Sie Zugriff auf ENV-Variablen haben, wird in scan
Kombination mit diesem kleinen regulären Ausdruck (der das vorletzte Wort, einen Punkt und das letzte Wort der Zeichenfolge findet) der Dateiname in 'Dateiname' eingefügt:
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
Natürlich können Sie scan
und den regulären Ausdruck für jeden Pfadnamen verwenden, der den Dateinamen enthält, und dies __FILE__
ist die offensichtliche Wahl:
__FILE__.scan(/\w+\.\w+$/)