Как я могу получить Ruby FileList для получения файлов без имени, например .htaccess на Windows - PullRequest
5 голосов
/ 29 марта 2010

Я хочу найти в моей файловой системе любые файлы с расширением .template.

ниже работает нормально для всех, кроме .htaccess.template

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

потому что windows не любит безымянные файлы, grrrr

Как мне заставить это работать в Windows? Этот код отлично работает в Linux ....

Ответы [ 2 ]

6 голосов
/ 29 марта 2010

Как насчет

Dir.glob([".*.template", "*.template"])
1 голос
/ 29 марта 2010

Если предположить, что FileList здесь является классом FileList от rake, то проблема в базовом классе Dir Ruby (который используется FileList) не соответствует файлам, начинающимся с . для * подстановочные. Соответствующая часть rake.rb составляет

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

Ниже приведен некрасивый хак, который переопределяет add_matching и включает в себя также файлы, начинающиеся с . Надеемся, что кто-нибудь другой предложит более элегантное решение.

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

Обновление: Я только что проверил это на Linux здесь, и файлы, начинающиеся с ., также не включены. например Если у меня есть каталог /home/mikej/root с 2 подкаталогами a и b, где каждый содержит first.template и .other.template, тогда

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

поэтому я бы дважды проверил поведение в Linux и убедился, что нет ничего другого, вызывающего разницу в поведении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...