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 LastIndexOfmé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 LastIndexOfmé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.
pathnamefonctionne avec les chemins d'accès locaux tout Fileen 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").basenameobtenir 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 LastIndexOfnotations disponibles.
Comme mentionné krusty.ar somelist.lastest 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, scancombiné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 scanet 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+$/)