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.
я
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..
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.
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
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.
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..
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.
Ruby también ofrece una API útil para trabajar con archivos.
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"
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.
El uso obvio de esto es eliminar el archivo que se pasa al método:
Archivo.delete "code.rb"
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 abierto
s 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.
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:
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..
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
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"]
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!