2010-03-29 11 views
5

Chcę przeszukać mój system plików dla plików o rozszerzeniu .template.Jak uzyskać plik Ruby FileList, aby odebrać pliki bez nazwy, na przykład .htaccess w systemie Windows

Poniższa działa dobrze na wszystko z wyjątkiem .htaccess.template

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

ponieważ okna nie lubi plików bezimiennych, grrrr

jaki sposób dokonać tej pracy w systemie Windows? Ten kod działa poprawnie w systemie Linux ....

Odpowiedz

6

Jak o

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

Zakładając, że FileList tutaj jest klasa FileList z prowizji to problem jest w leżącej Dir klasy Ruby (który jest używany przez FileList) nie pasujące pliki zaczynające . dla * zamiennika . Odpowiednia porcja rake.rb jest

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

Poniżej jest brzydki hack, który nadpisuje add_matching również zawierać pliki zaczynając . Mam nadzieję, że ktoś inny będzie wzdłuż zaproponować bardziej eleganckie rozwiązanie.

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 

Aktualizacja: właśnie przetestowane na Linuksie tutaj i pliki zaczynające się . nie są włączone albo. na przykład Jeśli mam katalogu /home/mikej/root z 2 podkatalogów a i b gdzie każdy zawiera first.template i .other.template następnie

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

tak bym dokładnie sprawdzić zachowanie w systemie Linux i sprawdzić, czy nie jest coś innego co powoduje różnicę w zachowaniu.

+0

co byłoby "alternatywną drogę"? –

+0

Nie znalazłem alternatywnego sposobu, ponieważ inne metody na 'Dir' również zachowują się tak samo. Jednak zobacz zaktualizowaną odpowiedź na obejście. – mikej

+0

@Andrew Bullock zapoznaj się z aktualizacją, której dokonałem, opisując wynik mojego testowania go na Linuksie, ponieważ to też nie obejmuje. pliki - czy może to być różnica w wersji Ruby na 2 platformach? W obu przypadkach mam 1.8.6. – mikej

Powiązane problemy