YOSHINO日記

プログラミングに関すること

ruby: Fileをチャンク単位でopenする

方法

blockが渡されたら、チャンク単位(以下の例では100bytes)でopen。

そうでなければ、まとめてopen。

require 'active_support'
require 'active_support/core_ext'

def my_open(path)
  if block_given?
    File.open(path, 'rb') do |file|
      while data = file.read(100.bytes)
        puts data.bytesize
        yield data
      end
    end
  else
    res = File.binread path
    puts res.bytesize
  end
end

実行

puts "chunk open"
chunks = []

my_open("sample.txt") do |chunk|
  chunks << chunk
end 

puts "no chunk open"
my_open("sample.txt")

結果

chunk open
100
100
100
27
no chunk open
327

参照

https://github.com/rails/activestorage/commit/f66a69076f43617bacfe45961e229268ed15faa7