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?


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.


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"

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"

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.


13

Versuchen Sie diesen Code

Verwenden extname

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

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"

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

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+$/)

-5

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

File.dirname __FILE__

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.