Opendir, readdir

Quiero acceder a los archivos de un directorio, cuál es el equivalente
en rails del opendir y readdir de php, hay algún ejemplo por ahí? Gracias

Miguel Angel Calleja Lázaro
escribió:

Quiero acceder a los archivos de un directorio, cuál es el equivalente
en rails del opendir y readdir de php, hay algún ejemplo por ahí? Gracias


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

Me respondo a mi mismo:

Dir.entries obtienes un array de los items del directorio y con
Dir.foreach los recorres

O puedes usar rubysmos como:

for entry in Dir["/home/*"]
puts “Directorio #{entry}”
end

El metodo [ ] de la clase Dir te permite buscar todos los archivos y
subdirectorios que coincidan con un patron, incluyendo subdirectorios
dentro de subdirectorios si usas “**”

Dir["./**/*.rb"].each {|entry| require entry} # incluye todos
los .rb en el directorio actual y sus subdirectorios

Sebastian D.
escribió:

Dir[“./**/*.rb”].each {|entry| require entry} # incluye todos
los .rb en el directorio actual y sus subdirectorios

On Mar 20, 2007, at 12:08 PM, Miguel Angel Calleja Lázaro wrote:

Estaba usando Dir.entries , pero el método [] me va a servir para otra
cosa, gracias.

el directorio tiene que ser la ruta absoluta? es decir, si tengo una
constante:

UPLOAD_DIR=“/home/www/proyecto/public/docs/” o podría ser
UPLOAD_DIR=“/public/docs/”

@dir=Dir[UPLOAD_DIR+“*”]

Ahora si lo recorro:

for d in @dir
d
end

me sale todo la ruta:
/home/www/proyecto/public/docs/P3090115.JPG
http://sangovi.host-sonoratec.biz/admin/inicio/popup_files?tipo=doc#

Con el Dir.entries me sale sólo el nombre del fichero, no toda la ruta,
qué he puesto mal o me falta por poner?

entries y [ ] funcionan ligeramente distinto. entries provee
solamente el nombre del archivo o directorio, sin la ruta, mientras
que [ ] te da la ruta completa.

En ambos casos, la ruta puede ser relativa al directorio actual (aun
cuando en tu ejemplo las dos rutas son absolutas por el / al inicio)

2007/3/20, Sebastian D. [email protected]:

O puedes usar rubysmos como:

for entry in Dir[“/home/*”]
puts “Directorio #{entry}”
end

El metodo [ ] de la clase Dir te permite buscar todos los archivos y
subdirectorios que coincidan con un patron, incluyendo subdirectorios
dentro de subdirectorios si usas “**”

Una pregunta muy basica… Si [] esu metodo, no deberia ser Dir.[]
(hay un punto)? Si no, como se diferencia un hash de una clase? O es
lo mismo? Me refiero, [] te permite tratar una clase como si fuese un
hash??

Una pregunta muy basica… Si [] esu metodo, no deberia ser Dir.[]
(hay un punto)? Si no, como se diferencia un hash de una clase? O es
lo mismo? Me refiero, [] te permite tratar una clase como si fuese un
hash??

en realidad [] es un operador. Lo que estamos haciendo aquí es lo que se
llama “operator overload” tradicionalmente.

La ventaja de Ruby -en este sentido- frente a otros lenguajes es que la
sintáxis que incorpora para la sobrecarga de operadores es muy simple.
Tanto como definir un método que se llame igual que el operador. A
partir de ahí ya puedes usar el operador directamente sin el separador .

Cosas así permiten que por ejemplo puedas utilizar + para concatenar dos
arrays. El uso que le des a los operadores sobrecargados dependerá de
cada caso.

saludos,

j

Estamos de estreno… si necesitas llevar el control de tus gastos
visita http://www.gastosgem.com !!Es gratis!!

llama “operator overload” tradicionalmente.

un detalle… siendo puristas se llama operator overloading (o sobrecarga
de operadores… te lo di en inglés porque encontrarás muchas más
referencias)

Sebastian D.
escribió:

UPLOAD_DIR=“/public/docs/”
/home/www/proyecto/public/docs/P3090115.JPG


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

Comprendido, si quiero decirle a Dir que me encuentre todos los ficheros
con extensiones .jpg y .gif, cómo puedo escribirlo?
@dir=Dir[“docs/.jpg"]
@dir2=Dir["docs/
.gif”], se puede escribir todo de una vez en el []?

Ruby te permite definir ciertos “operadores”, como [ ], == , +, -,
*, /, %, <<, etc, etc

La clase Hash simplemente define el metodo [ ] que le corresponde. Lo
mismo hace la clase Array.

Y muchas otras clases “aprovechan” esos operadores para definir
metodos utiles. Rails, por ejemplo, define [ ] en ActiveRecord como
un atajo a read_attribute

En este caso (el de Dir), ademas, el metodo esta definido sobre la
clase, no sobre las instancias. Es decir, es Dir[ ], y no Dir.new[ ].
Porque en Ruby las clases tambien son objetos en si mismas y tienen
sus propios metodos, incluyendo los metodos-operadores.

Espero haber agregado un poco mas a tu confusion :slight_smile:

Saludos,
Sebastian

Ya te han respondido otros. Una clase puede “sobrecargar” (redefinir,
reimplementar) los operadores básicos (+, -, *, / y otros). Esto existe
en C++ y otros lenguajes aunque, como te han dicho, la sintáxis de Ruby
lo hace muy, muy simple.

Aquí va un ejemplo de sobrecargar [] y *:

class MyClass
def initialize
@array = [0, 1, 2, 4]
end

def
@array[index]
end

def *(other)
@array.collect! {|a| a * other}
end
end

obj = MyClass.new
obj * 10
puts obj[3] # => 40

Miguel Angel Calleja Lázaro
escribió:

@dir=Dir[UPLOAD_DIR+"*"]

Comprendido, si quiero decirle a Dir que me encuentre todos los ficheros

Me respondo a mi mismo:
@dir=Dir[“docs/{.jpg,.gif}”]