240 votes

Comment obtenir un nom de fichier sans extension à partir d'un chemin de fichier en Ruby ?

Comment obtenir le nom du fichier à partir d'un chemin d'accès en Ruby ?

Par exemple, si j'ai un chemin d'accès de "C:\projects\blah.dll" et je veux juste le "blah".

Y a-t-il un LastIndexOf en Ruby ?

3 votes

N'oubliez pas qu'un point suivi de quelques caractères (trois, peut-être) n'a rien de spécial. Ils font partie du nom du fichier. Certains systèmes d'exploitation marginaux pensent qu'il y a quelque chose de spécial à propos de cette partie d'un nom de fichier, mais vous ne devriez pas tomber dans ce piège.

599voto

Jonathan Lonowski Points 45253

Essayez File.basename

Renvoie le dernier composant du nom de fichier donné dans nom_fichier, qui doit être formé en utilisant des barres obliques (``/'') indépendamment du séparateur utilisé sur le système de fichiers local. Si le suffixe est donné et présent à la fin de nom_de_fichier, il est supprimé.

File.basename("/home/gumby/work/ruby.rb")          #=> "ruby.rb"
File.basename("/home/gumby/work/ruby.rb", ".rb")   #=> "ruby"

Dans votre cas :

File.basename("C:\\projects\\blah.dll", ".dll")  #=> "blah"

0 votes

Avec Linux et Ruby 1.8 j'essaye de Pathname.new("some/path/to/my.file").basename et obtenir my.file/ :'(

70 votes

De manière plus générique, File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"

0 votes

La réponse devrait être ajouter la solution de @kelloti qui est meilleure.

93voto

korch Points 1253
require 'pathname'

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

Je n'ai pas été un utilisateur de Windows depuis longtemps, mais le Pathname rdoc dit qu'il n'a aucun problème avec les séparateurs de noms de répertoire sous Windows.

87 votes

Je ne sais pas pourquoi c'est la réponse la mieux classée alors que File.basename ne nécessite pas un 'require' supplémentaire de 'pathname'.

11 votes

Classe pathname fonctionne avec les chemins d'accès locaux tandis que File suppose toujours les noms de chemin Unix (la différence réside dans les séparateurs de chemin et de lecteur qui sont utilisés dans MS Windows, par exemple).

0 votes

@korch : Vous devriez probablement montrer les différents comportements de Pathname.new("C:/some/path").basename à File.basename("C:/some/path") (voir le commentaire de nimrodm).

58voto

Vinko Vrsalovic Points 116138

Dans le cas où 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"

5 votes

File.basename() est la réponse !

7voto

monkut Points 14549

La réponse de Jonathon est meilleure, mais pour vous faire savoir somelist[-1] est l'un des LastIndexOf les notations disponibles.

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

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"

2 votes

Le problème est que vous devez savoir si c'est un backslash ou un forwardslash.

3voto

krusty.ar Points 3141

Notez que les chaînes de guillemets doubles échappent aux \'s.

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

5 votes

Le traiter purement comme une chaîne, plutôt que comme un chemin, rend le code moins portable.

0 votes

C'est beaucoup plus complexe que nécessaire, et c'est spécifique à Windows. Vous pouvez simplement File.basename . Et, comme certaines des autres réponses, ne répond pas à la question du PO.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X