Gardez à l'esprit qu'il n'y a rien de spécial dans un point suivi de quelques (trois, peut-être) caractères. Ils font partie du nom du fichier. Certains systèmes d'exploitation marginaux pensent qu'il y a quelque chose de spécial dans cette partie d'un nom de fichier, mais vous ne devriez pas tomber dans ce piège.
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.
Je ne sais pas pourquoi c'est la réponse classée n ° 1 lorsque File.basename ne nécessite pas un "require" supplémentaire de "pathname".
GroovyCakes
11
La classe 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)
nimrodm
3
Bien qu'elle soit acceptée par le PO, cette réponse ne répond pas réellement à la question du PO. Voir les réponses de Jonathan Lonowski et Arup Rakshit.
GSnyder
6
L'extension est présente s'il y en a une. La réponse est fausse.
Ludovic Kuty
4
Veuillez ne pas vandaliser vos propres messages. Merci!
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é.
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.
Le traiter uniquement comme une chaîne, plutôt que comme un chemin, rend le code moins portable.
Boatcoder
Ceci est bien plus complexe que nécessaire et est spécifique à Windows. Tu peux juste File.basename. Et, comme certaines des autres réponses, ne répond pas à la question du PO.
Keith Bennett
0
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:
La question ne portait pas sur le chemin, mais sur le nom du fichier . "Comment puis-je obtenir le nom de fichier à partir d'un chemin de fichier dans Ruby?"
Réponses:
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.
la source
pathname
fonctionne avec les chemins d'accès locaux toutFile
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
Dans ton cas:
la source
Pathname.new("some/path/to/my.file").basename
obtenirmy.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 /):
la source
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.Mais, si vous souhaitez obtenir le nom de fichier de base de tout fichier d' extension spécifique , vous devez utiliser
File::extname
, sinon.la source
Essayez ce code
Utilisation
extname
la source
La réponse de Jonathon est meilleure, mais vous en informer
somelist[-1]
est l'une desLastIndexOf
notations disponibles.Comme mentionné krusty.ar
somelist.last
est apparemment aussi.la source
Notez que les guillemets doubles échappent aux chaînes.
la source
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':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:la source
Vous pouvez obtenir le chemin du répertoire du script actuel avec:
la source
File.basename __FILE__