2010-03-29 1 views
5

Je veux rechercher mon système de fichiers pour tous les fichiers avec l'extension .template.comment puis-je obtenir Ruby FileList pour ramasser des fichiers sans nom, comme. Htaccess sur Windows

Les travaux ci-dessous bien pour tout sauf .htaccess.template

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

parce que les fenêtres n'aime pas les fichiers sans noms, grrrr

Comment puis-je faire ce travail sur Windows? Ce code fonctionne très bien sur Linux ....

Répondre

6

Que diriez-vous

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

En supposant que FileList ici est la classe de rake FileList alors le problème est dans Dir classe sous-jacente de Ruby (qui est utilisé par FileList) pas les fichiers correspondant commençant par . pour le caractère générique * . La partie pertinente de rake.rb est

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

Voici un bidouille horrible qui l'emporte sur add_matching pour inclure également les fichiers commençant par . Espérons que quelqu'un d'autre sera le long de proposer une solution plus élégante.

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 

Mise à jour: Je viens de tester cela sur Linux ici et les fichiers commençant par . ne sont pas inclus non plus. par exemple. Si j'ai un répertoire /home/mikej/root avec 2 sous-répertoires a et b où chacun contient first.template et .other.template puis

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

donc je vérifier le comportement sur Linux et vérifier qu'il n'y a pas quelque chose d'autre cause la différence de comportement.

+0

quelle serait la "alternative"? –

+0

Je n'ai pas trouvé d'autre moyen car les autres méthodes sur 'Dir' se comportent également de la même manière. Cependant, consultez la réponse mise à jour pour une solution de contournement. – mikej

+0

@ Andrew Bullock s'il vous plaît voir la mise à jour que j'ai fait décrivant le résultat de mon test sur Linux car cela ne semble pas inclure le. fichiers - pourrait-il être une différence dans la version de Ruby sur les 2 plates-formes? Je suis sur 1.8.6 dans les deux cas. – mikej

Questions connexes