Ruby for Newbies Utilisation de répertoires et de fichiers

Ruby est l’un des langages les plus utilisés sur le Web. Nous avons récemment commencé une nouvelle session ici sur Nettuts + qui vous présentera Ruby, ainsi que les formidables cadres et outils associés au développement de Ruby. Aujourd'hui, nous allons regarder le Dir et Fichier classes, et comment nous pouvons les utiliser pour travailler avec des répertoires et des fichiers.

я


Voir le Screencast


Répertoires

pwd

Si vous avez beaucoup travaillé avec le terminal (ligne de commande AKA, shell AKA), vous saurez qu'il a la notion d'un répertoire en cours, appelé répertoire de travail. C’est le dossier dans lequel vous vous trouvez. Chaque fois que vous tapez une commande utilisant un fichier, le répertoire de travail sera le premier endroit où votre shell cherchera le fichier..

Ruby a une notion similaire lors de l'exécution du code. Il comprend la structure de dossiers du système d'exploitation et dispose d'outils utiles pour le travailler..

Alors, comment trouvez-vous le dossier dans lequel le script Ruby pense se trouver??

Dir.pwd # "/ Users / andrew / Documents"

le pwd (imprimer répertoire de travail) méthode sur le Dir classe nous donne cette information. Si tu es dans irb, votre répertoire de travail sera par défaut le dossier que vous avez ouvert irb Si vous êtes dans un script, ce sera l'emplacement d'où vous appelez le script.

chdir

Si vous voulez changer le répertoire de travail, vous pouvez utiliser le chdir méthode; transmettez-lui le chemin du répertoire dans lequel vous voulez vous déplacer:

Dir.chdir "Documents" Dir.chdir "/ users / andrew / Documents"

Comme vous pouvez le constater, le paramètre de chaîne peut être un chemin absolu ou relatif..

glob

Si vous recherchez certains fichiers dans le répertoire de travail (Dir.pwd), vous pouvez les obtenir en utilisant le Dir.glob méthode. Passez cette méthode a? Glob ?; c'est un modèle de recherche qui se situe quelque part entre une chaîne statique et une expression régulière complète. Vous pouvez utiliser un astérisque * comme un joker, comme vous le feriez dans la coque; vous pouvez utiliser un double astérisque ** faire correspondre les répertoires de manière récursive. Vous pouvez également utiliser des ensembles entre crochets comme vous le feriez avec des expressions régulières. Si vous avez besoin de plus, consultez la documentation complète. Dir.glob avec le retour d'un tableau? ou, vous pouvez passer un bloc et obtenir chaque match un par le.

# Rappelez-vous, ceci fonctionne sur le répertoire en cours all_text_files = Dir.glob "* .txt" Dir.glob ("** / *. [A-z]") do | nomfichier | # fera correspondre tout fichier de n'importe quel répertoire enfant avec une seule extension de lettre minuscule

nouveau et ouvert

Outre le logement de fonctions utiles, vous pouvez également créer une instance du Dir classe. Vous lui transmettez le nom du répertoire que vous souhaitez utiliser; comme avec toutes les fonctions qui prennent un chemin, cela peut être absolu ou relatif.

reciepts = Dir.new "reciepts" me = Dir.open "/ users / andrew"

Tous les deux Nouveau et ouvrir retourner un Dir objet; Cependant, il y a une autre façon d'utiliser ouvrir:

Dir.Open "/ utilisateurs / Andrew" do | dir | # l'utiliser ici fin

Ceci est une convention commune avec de nombreuses classes en ruby; au lieu de stocker le Dir objet dans une variable, vous pouvez le transmettre à un bloc et l'utiliser à partir de là. C'est un style de codage assez différent de celui que je n'ai pas vu dans une autre langue, mais c'est plutôt sympa que de s'y habituer.

Il y a de fortes chances que lorsque vous créez un Dir objet, vous aurez envie de travailler avec le contenu de celui-ci. Il y a plusieurs façons de le faire.

chaque

En supposant some_dir est Dir objet,

some_dir.each do | fichier | # faire quelque chose fin

Vous pouvez utiliser le chaque méthode sur Dir les objets à parcourir sur chaque fichier ou répertoire qui se trouve à l'intérieur. Notez que vous ne recevez pas un Fichier ou Dir objet; juste une chaîne avec le nom de celui-ci; si vous voulez faire plus, vous devrez instancier vous-même l'objet approprié.

les entrées

Si vous voulez juste voir le contenu d’un répertoire, vous pouvez utiliser le les entrées propriété, pour obtenir un tableau du contenu:

some_dir.entries # [".", "?", "file_one.txt", "un autre répertoire"]

Comme vous le remarquerez plus haut, l'entrée d'un répertoire comprend?.? et ?? ?, le pointeur lui-même et son répertoire parent.


Des dossiers

Ruby offre également une API utile pour travailler avec des fichiers..

chemin_absolu

Lorsque vous travaillez avec des fichiers, vous voudrez peut-être en obtenir le chemin absolu. le Fichier La classe offre exactement ce dont vous avez besoin:

File.absotule_path "plans.txt" # => "/users/andrew/Documents/plans.txt"

nom de base

Mais qu'en est-il de l'inverse? Vous avez le chemin absolu et vous voulez juste le nom du fichier? Au lieu de cela, utilisez nom de base

Nom du fichier ("/ users / andrew / Documents / plans.txt") # => "plans.txt" Nom du fichier ("/ users / andrew / Documents / plans.txt", ".txt") # => "des plans"

Si vous passez un deuxième paramètre de chaîne, la méthode recherchera cette chaîne à la fin du nom du fichier et la supprimera si elle se trouve à cet endroit. cela ne doit pas nécessairement être l'extension de fichier, mais c'est l'utilisation principale évidente de cette.

effacer

L’utilisation évidente de ceci est de supprimer le fichier que vous passez dans la méthode:

Fichier.delete "code.rb"

annuaire?

C’est utile; dis que tu es chaque-sur les entrées d’un Dir objet, mais vous ne voulez traiter que des fichiers. le Fichier.directory? la méthode retournera vrai si le paramètre de chaîne que vous lui transmettez est un répertoire, et faux si c'est un fichier.

Dir.open (Dir.pwd) .each do | filename | next si File.directory? nomfichier # sinon, fin du fichier de processus

Cet extrait ouvrirs le répertoire courant et passe un bloc au chaque méthode. le chaque La méthode passe les entrées du répertoire une à une au bloc. Cette première ligne à l'intérieur du bloc peut vous déranger un peu si vous n'êtes pas habitué à Ruby, mais regardez-la attentivement. La seule partie que vous ne connaissez pas est la suivant mot-clé, qui saute le reste du bloc et passe à l'itération suivante. Donc, nous disons: «passez à l'entrée suivante si l'entrée que nous avons actuellement est un répertoire. Si ce n'est pas un répertoire, nous pouvons faire ce que nous voulons.

nouveau et ouvert

Faire des exemples de la Fichier la classe fonctionne exactement comme avec Dir; File.new renvoie un Fichier objet, tandis que Fichier.Ouvert peut le retourner ou le transmettre à un bloc. Vous devez également passer un deuxième paramètre, qui décide de la manière dont le fichier sera ouvert. La plupart du temps, vous utiliserez probablement ceci:

  • ?r? : lecture seulement
  • ?w? : écriture seule (écrase tout ce qui se trouve dans le fichier, s'il existe)
  • ?w +? : lire et écrire (écrase tout ce qui est dans le fichier, si le fichier existe)
  • ?une? : écriture seule (commence à la fin du fichier, si le fichier existe)

Alors, quelles méthodes fait une instance de Fichier te donner? Eh bien, ces méthodes viennent en réalité de la IO classe à partir de laquelle Fichier hérite. La plupart du temps, vous ouvrez un fichier pour en lire ou en écrire le contenu, regardons donc cette fonctionnalité..

En train de lire

Avant de commencer, souvenez-vous de ceci: le fonctionnement d'un fichier, une fois la ligne lue, ne s'affiche plus; vous travaillez à travers le fichier. À tout moment, vous pouvez utiliser le f.rewind méthode pour revenir au début du fichier.

Si vous voulez juste lire le tout, vous pouvez le faire avec lis.

f = File.open ("sample.txt", "r") # assume ce fichier pour les prochains extraits f.read # => "quelque chose \ nline 2 \ na tiers \ nfour! \ \ n5555 \ nsixy \ nsevenly \ la nuit "

Cependant, vous voudrez probablement lire une ligne à la fois; pour ce faire, utilisez la méthode readline:

f.rewind # au début f.readline # "quelque chose \ n" f.readline # "ligne 2 \ n" f.readline # "un tiers \ n"

Vous pouvez aussi utiliser la méthode obtient au lieu de readline.

Il y a aussi un lignes de lecture méthode, qui retourne un tableau dans lequel les lignes sont des entrées:

f.rewind f.readlines # => ["quelque chose \ n", "ligne 2 \ n", "un troisième \ n", "quatre! \ n", "5555 \ n", "sixans \ n", " septièmement \ n "," huit "]

Enfin, vous pouvez utiliser chaque, et passez un bloc à la méthode pour travailler avec chaque ligne, une par une

f.rewind f.each do | line | met fin de ligne

L'écriture

Pour écrire, vous avez deux options: écrire et met. La principale différence est que met ajoute un saut de ligne à la fin de votre chaîne, tandis que écrire ne fait pas.

f = fichier.open ("fichier.txt", "w +") f.puts "première ligne" f.write "deuxième" f.write "ligne" f.rewind f.readlines # => ["première ligne \ n ", "deuxième ligne"]

Question pour vous

Eh bien, c’est tout pour Ruby For Newbies, Leçon 7. Il y a plus à découvrir dans la Dir et Fichier Des classes; consultez les documents pour Dir, File et IO pour plus (la classe IO est celle d'où File hérite ses méthodes d'instance).

Cependant, je suis curieux de savoir où vous voulez que cette série aille maintenant: voulez-vous continuer avec le langage Ruby ou voulez-vous évoluer vers l'utilisation de Ruby sur le Web? Les deux sens vous seront utiles en tant que développeur Web, alors exprimez votre opinion dans les commentaires.!