ディレクトリ内ファイルの再帰処理を高速に済ませたい
ホントの天才は世の中に二人いて、ひとりはアラン・チューリング。もうひとりは守安祥太郎だと声を大にしていいたい今日この頃、皆さんいかがお過ごしですか?
どっちかってーとrubyはwebアプリを書くため的な風潮の中、わたすは業務で使っておりますよ。ディレクトリ内のファイルを文字列加工して次工程に渡すのがわたすの仕事の40%を占めておりまして、このメンドーなことを高速で済ませ休憩所でいち早く至福の時間を求めるためにこんなの書いてみた。
require 'pathname' class Recur def initialize(dir) @path = Pathname.new(dir) @new_dir = @path.realpath + "done" end def write_to_one @path.find do |f| yield(f.read) if f.file? end end def write_to_each if @new_dir.exist? puts "'done' directory exists, which overwrites." else @new_dir.mkdir(0777) puts "create new 'done' directory." end @path.find do |f| if f.file? newfile = @new_dir + f.basename yield(newfile.to_s, f.read) end end end end
こんなかんじで高速に再帰処理。
require 'recur' dir = Recur.new('test') dir.write_to_each do |fn, str| open(fn, "wb") do |itm| itm.puts str end end
strで渡ってきたファイルごとの文字列をそのまま置換したり、eachで行ごとの処理をしたり。あとはオペレータさんとの相談ってことで。
ホントはこんなふうにしたかった。
require 'pathname' class Recur def initialize(dir) @path = Pathname.new(dir) @new_dir = @path.realpath + "done" end def write_to_each if @new_dir.exist? puts "'done' directory exists, which overwrites." else @new_dir.mkdir(0777) puts "create new 'done' directory." end @path.find do |f| if f.file? newfile = @new_dir + f.basename open(newfile.to_s, "wb") do |nf| yield(nk, f.read) end end end end end
とか書いて
dir = Recur.new('test') dir.write_to_each do |fn, str| fn.print str end
しかしこういうふうに書くと、ファイルは生成されてstrも持って来れるのにファイルに書くことができない。「fn.print "gagagaga"」とかしたらそれぞれのファイルに「gagagaga」は書かれるんだけど。なんでだろう?