88 votes

Comment ouvrir les fichiers relatifs au répertoire d'origine

L'opération suivante échoue avec Errno::ENOENT: No such file or directory même si le fichier existe :

open('~/some_file')

Cependant, je peux le faire :

open(File.expand_path('~/some_file'))

J'ai deux questions :

  1. Pourquoi est-ce que open traiter le tilde comme pointant vers le répertoire personnel ?
  2. Y a-t-il un moyen plus rusé que File.expand_path ?

118voto

allesklar Points 4905

Je ne sais pas si cela était disponible avant Ruby 1.9.3 mais je trouve que la solution la plus élégante est d'utiliser Dir.home qui fait partie du noyau.

open("#{Dir.home}/some_file")

105voto

Roadmaster Points 3533
  1. L'interpréteur de commandes (bash, zsh, etc.) est responsable de l'expansion des caractères génériques. Dans votre premier exemple, il n'y a pas d'interpréteur de commandes, donc pas d'expansion. L'utilisation du tilde pour pointer vers $HOME n'est qu'une simple convention ; en effet, si vous regardez la documentation de l'application File.expand_path il interprète correctement le tilde, mais c'est une caractéristique de la fonction elle-même, et non quelque chose d'inhérent au système sous-jacent ; également, File.expand_path exige que le $HOME pour que la variable d'environnement soit correctement définie. Ce qui nous amène à l'alternative possible...
  2. Essayez ça :

    open(ENV['HOME']+'/some_file')

J'espère que c'est assez élégant. Je pense personnellement que l'utilisation d'une variable d'environnement est sémantiquement plus claire que l'utilisation de expand_path .

12voto

Ransom Ani-Gizzle Points 389

Au lieu de s'appuyer sur le $HOME qui est correctement définie, ce qui peut être un problème lorsque vous utilisez des ordinateurs de réseau partagés pour le développement, vous pouvez l'obtenir à partir de Ruby en utilisant :

require 'etc'
open ("#{Etc.getpwuid.dir}/some_file")

Je pense que cela permet d'identifier l'utilisateur actuellement connecté et de récupérer son répertoire personnel plutôt que de s'appuyer sur le répertoire global de l'utilisateur. $HOME variable d'environnement en cours de définition. C'est une solution alternative à ce qui précède, je pense.

2voto

J'ai découvert le problème du tilde, et un patch a été créé pour ajouter absolute_path qui traite le tilde comme un caractère ordinaire.

A partir de la documentation sur les fichiers :

absolute_path(file_name [, dir_string] ) → abs_file_name

Convertit un nom de chemin en un nom de chemin absolu. Les chemins relatifs sont référencés à partir du répertoire de travail actuel du processus sauf si dir_string est donné, auquel cas il sera utilisé comme point de départ. Si le nom de chemin donné commence par un "~", il n'est PAS développé, il est traité comme un nom de répertoire normal.

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