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.
Ich war lange Zeit kein Windows-Benutzer mehr, aber der Pfadname rdoc sagt, dass es unter Windows keine Probleme mit Verzeichnisnamen-Trennzeichen gibt.
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!
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.
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.
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:
Antworten:
Ich war lange Zeit kein Windows-Benutzer mehr, aber der Pfadname rdoc sagt, dass es unter Windows keine Probleme mit Verzeichnisnamen-Trennzeichen gibt.
quelle
pathname
arbeitet mit lokalen Pfadnamen, währendFile
immer Unix-Pfadnamen angenommen werden (Unterschied sindVersuchen
File.basename
In deinem Fall:
quelle
Pathname.new("some/path/to/my.file").basename
ichmy.file/
: '(File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
?Falls die Erweiterung nicht bekannt ist (sie benötigt das / separator):
quelle
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.Wenn Sie jedoch den Basisdateinamen einer bestimmten Erweiterungsdatei abrufen möchten, müssen Sie diese verwenden
File::extname
, andernfalls nicht.quelle
Versuchen Sie diesen Code
Verwenden
extname
quelle
Jonathons Antwort ist besser, aber Sie wissen zu lassen,
somelist[-1]
ist eine derLastIndexOf
verfügbaren Notationen.Wie krusty.ar
somelist.last
anscheinend auch erwähnt.quelle
Beachten Sie, dass Zeichenfolgen in doppelten Anführungszeichen nicht angezeigt werden.
quelle
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: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:quelle
Sie können den Verzeichnispfad zum aktuellen Skript abrufen mit:
quelle
File.basename __FILE__