Ruby para principiantes trabajar con directorios y archivos

Ruby es uno de los idiomas más populares utilizados en la web. Recientemente comenzamos una nueva sesión aquí en Nettuts + que te presentará a Ruby, así como a los excelentes marcos y herramientas que acompañan el desarrollo de Ruby. Hoy vamos a ver el Dir y Expediente clases, y cómo podemos usarlas para trabajar con directorios y archivos.

я


Ver Screencast


Directorios

pwd

Si ha trabajado mucho con el terminal (línea de comando AKA, shell AKA), sabrá que tiene la noción de un directorio actual, llamado directorio de trabajo. Esta es la carpeta en la que se encuentra actualmente. Cada vez que escribe un comando que usa un archivo, el directorio de trabajo será el primer lugar donde su shell busque el archivo..

Ruby tiene una noción similar cuando ejecuta código. Entiende la estructura de carpetas del sistema operativo y tiene algunas herramientas útiles para trabajar con ella..

Entonces, ¿cómo averigua en qué carpeta cree que está el script Ruby??

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

los pwd (directorio de trabajo de impresión) método en la Dir La clase nos da esa información. Si estas en irb, Su directorio de trabajo será, por defecto, la carpeta que inició. irb Si está en un script, será la ubicación desde la que llama al script..

chdir

Si desea cambiar el directorio de trabajo, puede utilizar el chdir método; pásale la ruta al directorio al que quieres moverte:

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

Como puede ver, el parámetro de cadena puede ser una ruta absoluta o una ruta relativa.

glob

Si está buscando ciertos archivos dentro del directorio de trabajo (Dir.pwd), puede obtenerlos usando el Dir.glob método. Pase ese método a? Glob ?; ese es un patrón de búsqueda que está en algún lugar entre una cadena estática y una expresión regular completa. Puedes usar un asterisco * como un comodín, tal como lo haría en la cáscara; puedes usar un doble asterisco ** para hacer coincidir directorios recursivamente. También puede usar conjuntos entre corchetes como lo haría con expresiones regulares. Si necesitas más, mira los documentos completos.. Dir.glob con devolver una matriz? o, puedes pasarlo un bloque y obtener cada partido uno por uno en.

# Recuerde, esto se ejecuta en el directorio actual all_text_files = Dir.glob "* .txt" Dir.glob ("** / *. [A-z]") do | filename | # coincidirá con cualquier archivo en cualquier directorio secundario con un único extremo de extensión de letras minúsculas

nuevo abierto

Además de albergar funciones útiles, también puede crear una instancia de Dir clase. Le pasas el nombre del directorio que quieres usar; Al igual que con todas las funciones que toman un camino, puede ser absoluta o relativa..

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

Ambos nuevo y abierto devolver un Dir objeto; Sin embargo, hay otra forma de usar. abierto:

Dir.open "/ users / andrew" do | dir | # usalo aqui fin

Esta es una convención común con muchas clases en Ruby; en lugar de almacenar el Dir En una variable, puede pasarlo a un bloque y usarlo desde allí. Es un estilo de codificación bastante diferente que no he visto en ningún otro idioma, pero es bastante agradable solo que te acostumbras.

Hay una buena posibilidad de que al crear un Dir Objeto, querrás trabajar con el contenido del mismo. Hay algunas maneras de hacer eso.

cada

Asumiendo some_dir es Dir objeto,

some_dir.each do | file | # hacer algo al final

Puedes usar el cada método en Dir objetos para iterar sobre cada archivo o directorio que está dentro de él. Tenga en cuenta que no está recibiendo una Expediente o Dir objeto; sólo una cadena con el nombre de ella; Si quieres hacer más, tendrás que crear una instancia del objeto apropiado..

entradas

Si solo quiere ver lo que hay dentro de un directorio, puede usar el entradas propiedad, para obtener una matriz de los contenidos:

some_dir.entries # [".", "?", "file_one.txt", "another_directory"]

Como verás más arriba, los requisitos para un directorio incluyen?. y ?? ?, puntero a sí mismo y su directorio padre.


Archivos

Ruby también ofrece una API útil para trabajar con archivos.

absolute_path

Cuando trabaje con archivos, es posible que desee obtener la ruta absoluta de uno. los Expediente La clase ofrece exactamente lo que necesitas:

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

nombre base

Pero ¿qué hay de lo contrario? ¿Tienes la ruta absoluta y quieres solo el nombre del archivo? En su lugar, utilice nombre base

File.basename ("/ users / andrew / Documents / plans.txt") # => "plans.txt" File.basename ("/ users / andrew / Documents / plans.txt", ".txt") # => "planes"

Si pasa un segundo parámetro de cadena, el método buscará esa cadena al final del nombre del archivo y la eliminará si está allí; Esta no tiene que ser la extensión del archivo, pero ese es el uso principal obvio para este.

borrar

El uso obvio de esto es eliminar el archivo que se pasa al método:

Archivo.delete "code.rb"

directorio?

Esto es útil; di que eres cada-sobre las entradas de un Dir objeto, pero sólo desea tratar con archivos. los Directorio de archivos? el método regresará cierto si el parámetro de cadena que le pasa es un directorio, y falso si es un archivo.

Dir.open (Dir.pwd) .each do | filename | Siguiente si File.directory? nombre de archivo # de lo contrario, procesar el final del archivo

Este fragmento abiertos el directorio actual y pasa un bloque a la cada método. los cada El método pasa las entradas del directorio una por una al bloque. Esa primera línea dentro del bloque puede confundirte un poco si no estás acostumbrado a Ruby, pero míralo con cuidado. La única parte con la que no estás familiarizado es la siguiente palabra clave, que omite el resto del bloque y pasa a la siguiente iteración del mismo. Entonces, estamos diciendo,? Pase a la siguiente entrada si la entrada que tenemos actualmente es un directorio. Si no es un directorio, podemos hacer lo que queramos.

nuevo abierto

Haciendo instancias de la Expediente La clase funciona igual que con Dir; Archivo.nuevo devuelve un Expediente objeto, mientras File.open Puede devolverlo, o pasarlo a un bloque. También debe pasar un segundo parámetro, que decide cómo se abrirá el archivo. La mayoría de las veces, probablemente uses estos:

  • ?r? : solo lectura
  • ?w? : solo escritura (sobrescribe cualquier cosa en el archivo, si el archivo existe)
  • ?w +? : leer y escribir (sobrescribe cualquier cosa en el archivo, si el archivo existe)
  • ?¿una? : solo escritura (comienza al final del archivo, si el archivo existe)

Entonces, ¿qué métodos hace una instancia de Expediente ¿darte? Bueno, estos métodos en realidad provienen de la IO clase, de la cual Expediente hereda La mayoría de las veces, estará abriendo un archivo para leer o escribir contenido, así que echemos un vistazo a esa funcionalidad..

Leyendo

Antes de comenzar, recuerde esto: la forma en que funciona un archivo, una vez que se ha leído una línea, no se vuelve a mostrar; estás trabajando a tu manera a través del archivo. En cualquier momento, puede utilizar el f.rewind Método para volver al principio del archivo..

Si solo quieres leerlo todo, puedes hacerlo con leer.

f = File.open ("sample.txt", "r") # asume este archivo para el siguiente par de fragmentos f.read # => "algo \ nline 2 \ na tercero \ nfour! \ n5555 \ nsixy \ nsevenly \ noche

Sin embargo, probablemente querrá leer una línea a la vez; para hacer eso, usa el método readline:

f.rewind # al principio f.readline # "algo \ n" f.readline # "línea 2 \ n" f.readline # "un tercero \ n"

También puedes usar el método. consigue en lugar de readline.

También hay un líneas de lectura Método, que devuelve una matriz en la que las líneas como entradas:

f.rewind f.readlines # => ["algo \ n", "línea 2 \ n", "un tercero \ n", "cuatro! \ n", "5555 \ n", "sixy \ n", " siete \ n "," ocho "]

Finalmente, puedes usar cada, y pase un bloque al método para trabajar con cada línea, una por una

f.rewind f.each do | line | pone fin de linea

Escritura

Para escribir, tienes dos opciones: escribir y pone. La principal diferencia es que pone agrega un salto de línea al final de la cadena, mientras que escribir no.

f = File.open ("file.txt", "w +") f.puts "first line" f.write "second" f.write "line" f.rewind f.readlines # => ["first line \ n ", "segunda linea"]

Una pregunta para ti

Bueno, eso es todo para Ruby For Newbies, Lección 7. Hay más por descubrir en el Dir y Expediente clases revisa los documentos de Dir, File y IO para obtener más información (la clase IO es desde donde File hereda sus métodos de instancia).

Sin embargo, tengo curiosidad por saber a dónde quieres que vaya esta serie: ¿quieres continuar con el lenguaje de Ruby o quieres avanzar hacia el uso de Ruby en la web? Ambas direcciones serán valiosas para usted como desarrollador web, así que exprese su opinión en los comentarios!