9

Dir.glob を使用して、ワイルドカード パターンに一致するすべてのファイルのセットにアクセスしています。

Dir.glob( '**/*.txt' ) { |file_name|
    parse file_name
}

この glob 呼び出しは再帰的であり、多くのファイルが関係しているため、glob はブロックが開始する前にファイルの配列を構築するのに長い時間がかかります。

私が代わりに望むのは、すべての同じファイルにアクセスする方法ですが、Ruby が各ファイルを「発見」した直後にブロックを呼び出して、ディレクトリ ツリー全体の検索が完了するのを待った後ではなく、最初のファイルがすぐに処理されるようにすることです。 .

そのような構造はありますか?

4

2 に答える 2

3

これを行うことができる組み込みの方法はないようです。

これがお役に立てば幸いです。パターンを再帰的に展開してファイルを検索 (Ruby 1.9.3):

class Dir
   def self.glob_recursively( pattern, &block )
     begin
       glob(pattern, &block)
       dirs = glob('*').select { |f| File.directory? f }
       dirs.each do |dir|
         # Do not process symlink
         next if File.symlink? dir
         chdir dir
         glob_recursively(pattern, &block)
         chdir '..'
       end
     rescue SystemCallError => e
       # STDERR
       warn "ERROR: #{pwd} - #{e}"
     end
   end
end

Dir.glob_recursively ('*.txt') {|file| puts file}
于 2013-05-10T18:32:31.690 に答える