So erhalten Sie einen Dateinamen ohne Erweiterung aus dem Dateipfad in Ruby

233

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?

dagda1
quelle
3
Denken Sie daran, dass ein Punkt nichts Besonderes ist, gefolgt von einigen (vielleicht drei) Zeichen. Sie sind Teil des Dateinamens. Einige Randbetriebssysteme denken, dass dieser Teil eines Dateinamens etwas Besonderes ist, aber Sie sollten nicht in diese Falle tappen.
James Moore

Antworten:

94
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.

NobodyNada
quelle
86
Ich weiß nicht, warum dies die Antwort auf Platz 1 ist, wenn File.basename kein zusätzliches 'require' von 'pathname' erfordert.
GroovyCakes
11
Klasse pathnamearbeitet mit lokalen Pfadnamen, während Fileimmer Unix-Pfadnamen angenommen werden (Unterschied sind
Pfad-
3
Obwohl diese Antwort vom OP akzeptiert wird, beantwortet sie die Frage des OP nicht wirklich. Siehe die Antworten von Jonathan Lonowski und Arup Rakshit.
GSnyder
6
Die Erweiterung ist vorhanden, falls vorhanden. Die Antwort ist falsch.
Ludovic Kuty
4
Bitte zerstören Sie nicht Ihre eigenen Beiträge. Vielen Dank!
NobodyNada
586

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"
Jonathan Lonowski
quelle
Mit Linux und Ruby 1.8 versuche Pathname.new("some/path/to/my.file").basenameich my.file/: '(
java.is.for.desktop
67
AllgemeinerFile.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
Kelloti
Die Antwort sollte die Lösung von @kelloti hinzufügen, die besser ist.
Ymoreau
@kelloti: Was ist mit /my/file.tar.gz?
Richard-Degenne
56

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"
Vinko Vrsalovic
quelle
5
File.basename () ist die Antwort!
Sivabudh
26

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.

Arup Rakshit
quelle
13

Versuchen Sie diesen Code

Verwenden extname

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

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"
Mönch
quelle
1
Das Problem dabei ist, dass Sie wissen müssen, ob es sich um einen Backslash oder einen Forwardslash handelt
Joseph Le Brech
4

Beachten Sie, dass Zeichenfolgen in doppelten Anführungszeichen nicht angezeigt werden.

'C:\projects\blah.dll'.split('\\').last
krusty.ar
quelle
5
Behandelt es nur als Zeichenfolge und nicht als Pfad, wodurch der Code weniger portabel wird.
Bootscodierer
Dies ist weitaus komplexer als erforderlich und Windows-spezifisch. Sie können einfach File.basename. Und beantwortet, wie einige der anderen Antworten, die Frage des OP nicht.
Keith Bennett
0

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+$/)
Dave Everitt
quelle
-5

Sie können den Verzeichnispfad zum aktuellen Skript abrufen mit:

File.dirname __FILE__
Smar
quelle
Bei der Frage ging es nicht um den Pfad, sondern um den Dateinamen . "Wie kann ich den Dateinamen von einem Dateipfad in Ruby abrufen?"
Fontno
Das wäre:File.basename __FILE__
Samuel