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 LastIndexOfMethode 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 LastIndexOfMethode 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.
pathnamearbeitet mit lokalen Pfadnamen, während Fileimmer 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").basenameich 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::extnamekö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 LastIndexOfverfügbaren Notationen.
Wie krusty.ar somelist.lastanscheinend 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 scanKombination 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 scanund 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+$/)