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?
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.
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"
_
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"
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.
Essayez ce code
Utilisez extname
File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test"
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"
Notez que les guillemets doubles échappent des chaînes.
'C:\projects\blah.dll'.split('\\').last
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+$/)