2010-03-29 6 views
5

Quiero buscar en mi sistema de archivos cualquier archivo con la extensión .template.cómo obtengo Ruby FileList para recoger archivos sin nombre, como .htaccess en windows

El siguiente funciona bien para todo, excepto .htaccess.template

FileList.new(File.join(root, '**', '*.template')).each do |file| 
    # do stuff with file 
end 

porque las ventanas no le gusta archivos sin nombre, grrrr

¿Cómo puedo hacer este trabajo en Windows? Este código funciona bien en Linux ....

Respuesta

6

¿Qué tal

Dir.glob([".*.template", "*.template"]) 
1

Suponiendo que FileList aquí es la clase de FileList rastrillo entonces el problema está en Dir clase subyacente de Ruby (que es utilizado por FileList) que no coincida con los archivos que comienzan con . para la * comodín . La parte pertinente de rake.rb es

# Add matching glob patterns. 
def add_matching(pattern) 
    Dir[pattern].each do |fn| 
    self << fn unless exclude?(fn) 
    end 
end 

a continuación es un truco feo que anula add_matching para incluir también los archivos que comienzan con . Con suerte alguien más va a ser a lo largo de sugerir una solución más elegante.

class Rake::FileList 
    def add_matching(pattern) 
    files = Dir[pattern] 
    # ugly hack to include files starting with . on Windows 
    if RUBY_PLATFORM =~ /mswin/ 
     parts = File.split(pattern) 
     # if filename portion of the pattern starts with * also 
     # include the files matching '.' + the same pattern 
     if parts.last[0] == ?* 
     files += Dir[File.join(parts[0...-1] << '.' + parts.last)] 
     end 
    end  
    files.each do |fn| 
     self << fn unless exclude?(fn) 
    end 
    end 
end 

Actualización: acabo de probado esto en Linux aquí y los archivos que comienzan con . no se incluyen tampoco. p.ej. Si tengo un directorio /home/mikej/root con 2 subdirectorios a y b, donde cada uno contiene first.template y luego .other.template

Rake::FileList.new('home/mikej/root/**/*.template') 
=> ["/home/mikej/root/a/first.template", "/home/mikej/root/b/first.template"] 

así que habría vuelva a comprobar el comportamiento en Linux y verificar que no hay algo más que está haciendo la diferencia en el comportamiento.

+0

lo que sería el "camino alternativo"? –

+0

No he encontrado una manera alternativa ya que los otros métodos en 'Dir' también se comportan igual. Sin embargo, vea la respuesta actualizada para una solución alternativa. – mikej

+0

@ Andrew Bullock, por favor vea la actualización que he hecho describiendo el resultado de mi prueba en Linux, ya que tampoco parece incluir el. archivos: ¿podría ser una diferencia en la versión de Ruby en las 2 plataformas? Estoy en 1.8.6 en ambos casos. – mikej

Cuestiones relacionadas