web-dev-qa-db-fra.com

Comment obtenir un nom de fichier sans extension à partir du chemin du fichier dans Ruby

Comment puis-je obtenir le nom de fichier à partir d'un chemin de fichier dans Ruby?

Par exemple, si j'ai un chemin de "C:\projects\blah.dll" et que je veux juste le "bla".

Existe-t-il une méthode LastIndexOf dans Ruby?

225
dagda1
require 'pathname'

Pathname.new('/opt/local/bin/Ruby').basename
# => #<Pathname:Ruby>

Je ne suis pas un utilisateur Windows depuis longtemps, mais le rdoc Pathname indique qu'il n'a aucun problème avec les séparateurs de noms de répertoires sous Windows.

93
user46519

Essayez File.basename

Renvoie le dernier composant du nom de fichier indiqué dans nom_fichier, qui doit être formé à l'aide de barres obliques (``/’’), quel que soit le séparateur utilisé sur le système de fichiers local. Si le suffixe est donné et présent à la fin de nom_fichier, il est supprimé.

_File.basename("/home/gumby/work/Ruby.rb")          #=> "Ruby.rb"
File.basename("/home/gumby/work/Ruby.rb", ".rb")   #=> "Ruby"
_

Dans ton cas:

_File.basename("C:\\projects\\blah.dll", ".dll")  #=> "blah"
_
580
Jonathan Lonowski

Si l'extension n'est pas connue (il faut le séparateur /):

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"
55
Vinko Vrsalovic

Jonathan Lonowski répondit parfaitement, mais il y a quelque chose qu'aucune des réponses mentionnées ici. Au lieu de File::extname , vous pouvez directement utiliser un _'.*'_ pour obtenir le nom du fichier.

_File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"
_

Toutefois, si vous souhaitez obtenir le nom de fichier de base de des fichiers d’extension spécifiques , vous devez utiliser _File::extname_, sinon, pas.

25
Arup Rakshit

Essayez ce code

Utilisez extname

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

La réponse de Jonathon est meilleure, mais vous informer que somelist[-1] est l'une des notations LastIndexOf disponibles.

Comme krusty.ar l'a mentionné, somelist.last l'est apparemment aussi.

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"
7
monkut

Notez que les guillemets doubles échappent des chaînes.

'C:\projects\blah.dll'.split('\\').last
4
krusty.ar

Si vous avez accès aux variables ENV, scan combiné à cette petite regex (qui trouve l'avant dernier mot, un point, puis le dernier mot de la chaîne) placera le nom du fichier dans 'nom du fichier':

filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)

Évidemment, vous pouvez utiliser scan et l'expression régulière sur n'importe quel nom de chemin contenant le nom du fichier, et __FILE__ constitue le choix évident:

__FILE__.scan(/\w+\.\w+$/)
0
Dave Everitt