Comment ouvrir des fichiers par rapport au répertoire personnel


95

Ce qui suit échoue Errno::ENOENT: No such file or directory, même si le fichier existe:

open('~/some_file')

Cependant, je peux faire ceci:

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

J'ai deux questions:

  1. Pourquoi ne traite-t-il pas openle tilde comme pointant vers le répertoire de base?
  2. Y a-t-il un moyen plus lisse que File.expand_path?

Réponses:


109
  1. Le shell (bash, zsh, etc.) est responsable de l'expansion des caractères génériques, donc dans votre premier exemple, il n'y a pas de shell, donc pas d'expansion. Utiliser le tilde pour pointer vers $HOMEest une simple convention; en effet, si vous regardez la documentation pour File.expand_path, il interprète correctement le tilde, mais c'est une caractéristique de la fonction elle-même, pas quelque chose d'inhérent au système sous-jacent; File.expand_pathnécessite également que la $HOMEvariable d'environnement soit correctement définie. Ce qui nous amène à l'alternative possible ...
  2. Essaye ça:

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

J'espère que c'est assez lisse. Personnellement, je pense que l'utilisation d'une variable d'environnement est sémantiquement plus claire que l'utilisation expand_path.


en utilisant Windows .. avait à faireopen(ENV['HOME']+'some_file')
David West

9
Utilisez simplement File.join(ENV['HOME'], '/some_file')pour le faire fonctionner dans les deux cas.
Marcin Bilski


12

Au lieu de vous fier à la $HOMEdéfinition correcte de la variable d'environnement, ce qui pourrait être un problème lorsque vous utilisez des ordinateurs en réseau partagé pour le développement, vous pouvez l'obtenir auprès de Ruby en utilisant:

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

Je crois que cela identifie l'utilisateur actuellement connecté et obtient son répertoire personnel plutôt que de se fier à la $HOMEvariable d'environnement globale définie. C'est une solution alternative à ce que je pense ci-dessus.


2

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.

À partir de la documentation du fichier:

absolute_path(file_name [, dir_string] )  abs_file_name

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.