Nacho: 

Dir.[] o Dir.glob toman como parametro un "glob pattern" 
(http://en.wikipedia.org/wiki/Glob_pattern) que es un patron similar a una 
expresion regular pero menos poderoso que generalmente se usa para describir 
archivos.

El glob Dir[/directorio/**/*'] recorre todos los archivos en el directorio 
"directorio" __Y__ sus subdirectorios, por lo que no hace falta que lo 
implementes por tu cuenta. Otra cosa buena es que a Dir.[] le podes pasar mas 
de un glob pattern si queres, ejemplo:

Dir.glob ["/tmp/**/*", "/etc/**/*"].each do |file|
...
end

que busca todos los archivos en /tmp y sus subdirectorios __y__ todos los 
archivos /etc y susu subdirectorios.

NachoKB <[EMAIL PROTECTED]> escribió: Cuidado que Find no es una clase, sino un 
módulo.

O sea, no es para usarlo directamente... normalmente es para incorporarlo en 
una clase (para componer comportamiento). Lo mismo con FileTest.

Me parece que lo que querés hacer lo podés hacer sólo usando File y Dir... 

Básicamente, vos querés agarrar todos los archivos a partir de un root dado 
(recursivamente) y calcularle el MD5:

 Dir.new(directorio).map do |fullpath|
  [name, Digest::MD5.hexdigest (File.read(fullpath))]
end

El problema es que (1) si bien Dir es Enumerable, enumera sólo los hijos 
directo (no rescursivamente) y (2) "fullpath" no quedaría realmente el path 
completo... Por lo tanto hice esto, ver qué opinan: 

class TraversableDir
   include Enumerable
  def initialize(*args, &block)
     @dir = Dir.new *args, &block
  end
   def each(&block)
    @dir.each do |name|
       unless ['.', '..'].include? name
        fullpath =  self.fullpath(name)
        case
           when File.directory?(fullpath)
            TraversableDir.new(fullpath).each &block
           when File.file?(fullpath)
            block.call fullpath 
          else
             p "Ojo ni dir ni file: #{fullpath} (hay que hacer algo?)"
        end
       end
    end
   end
  def fullpath(name)
     File.expand_path "[EMAIL PROTECTED]/#{name}"
  end
 end

Entonces queda:
 TraversableDir.new(directorio).map do |fullpath|
  [name, Digest::MD5.hexdigest (File.read(fullpath))]
end
  
Lo que te daria un array de esta forma:
 [
  [ "/path/a1", "ABDCE" ],
   [ "/path/a2", "DEADBEEF" ]
]
  
Que es un idiom usado en Ruby (es similar a un Hash pero a veces se usa así, 
por ejemplo cuando no necesitás acceder a un elemento, sino que lo vas a 
iterar).

On 8/31/07,  Damian Janowski <[EMAIL PROTECTED]> wrote: On 8/31/07, Martin 
Sagastume <[EMAIL PROTECTED]> wrote:
> Excelente, eso era lo que necesitaba...muchas gracias!!
>
> Estuve mirando si el "API" de Rails...creo que no vi eso :P  ..una 
> cosa que me llamó la atención es que la clase Find tenga programado el
> método find  ...como que es medio desprolijo el hecho de tener un
> metodo que se llame igual que la clase (ya que en ruby no es el 
> constructor)  Buscar.buscar  en lugar de Buscador.buscar o algo asi
> ...  es por algo en especial ?

Nu sé :)

Pero me parece que suele pasar con esas pequeñas funcionalidades que
son casi "helper" y muchas veces quedan como métodos de clase, etc. 

Por ejemplo: Iconv.iconv

Saludos!
_______________________________________________
Ruby mailing list
[email protected]
 http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar


 _______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar


       
---------------------------------

¡Sé un mejor fotógrafo!
Perfeccioná tu técnica y encontrá las mejores fotos.
Visitá http://ar.yahoo.com/promos/mejorfotografo.html
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a