Comment puis-je obtenir le nom de fichier à partir d'un chemin de fichier dans Ruby?
Par exemple, si j'ai un chemin d'accès "C:\projects\blah.dll"
et que je veux juste le "bla".
Existe-t-il une LastIndexOf
méthode en Ruby?
Comment puis-je obtenir le nom de fichier à partir d'un chemin de fichier dans Ruby?
Par exemple, si j'ai un chemin d'accès "C:\projects\blah.dll"
et que je veux juste le "bla".
Existe-t-il une LastIndexOf
méthode en Ruby?
Réponses:
require 'pathname'
Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>
Je n'ai pas été un utilisateur Windows depuis longtemps, mais le rdoc Pathname dit qu'il n'a aucun problème avec les séparateurs de noms de répertoire sur Windows.
pathname
fonctionne avec les chemins d'accès locaux tout File
en supposant toujours les chemins d'accès Unix (la différence est les séparateurs de chemin et de lecteur qui sont utilisés dans MS Windows, par exemple)
Essayer File.basename
Renvoie le dernier composant du nom de fichier donné 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"
Pathname.new("some/path/to/my.file").basename
obtenir my.file/
: '(
File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
/my/file.tar.gz
?
Dans le cas où l'extension n'est pas connue (elle a besoin du 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 a répondu 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"
Mais, si vous souhaitez obtenir le nom de fichier de base de tout fichier d' extension spécifique , vous devez utiliser File::extname
, sinon.
Essayez ce code
Utilisation 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 en informer somelist[-1]
est l'une des LastIndexOf
notations disponibles.
Comme mentionné krusty.ar somelist.last
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 aux chaînes.
'C:\projects\blah.dll'.split('\\').last
File.basename
. Et, comme certaines des autres réponses, ne répond pas à la question du PO.
Si vous avez accès aux variables ENV, scan
combinées à ce petit regex (qui trouve le dernier mot mais un, un point, puis le dernier mot de la chaîne) mettra le nom du fichier dans 'nom de fichier':
filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)
De toute évidence, vous pouvez utiliser scan
et l'expression régulière sur n'importe quel nom de chemin qui inclut le nom de fichier, et __FILE__
c'est le choix évident:
__FILE__.scan(/\w+\.\w+$/)