В сценарии Ruby я хочу работать с первыми несколькими строками исходного файла (читая их с помощью .readline
) и просто скопировать оставшуюся часть исходного файла в целевой файл (с IO.copy_stream
на открытомфайлы).Тем не менее, IO.copy_stream
, похоже, не "видит" остальную часть исходного файла.
Вот как воспроизвести проблему:
require 'rspec'
require 'tempfile'
def file_create(content)
Tempfile.open('foo') do |src|
src.print content
src.close
yield src.path
end
end
describe :copy_stream do
it 'copies the content of an open file' do
file_create("a\nb\n") do |path|
open(path) do |from|
Tempfile.open('bar') do |to|
IO.copy_stream(from, to)
to.close
expect(IO.read(to.path)).to eq "a\nb\n"
end
end
end
end
it 'copies the rest of an open file' do
file_create("a\nb\n") do |path|
open(path) do |from|
Tempfile.open('bar') do |to|
to.print from.readline
IO.copy_stream(from, to)
to.close
expect(IO.read(to.path)).to eq "a\nb\n"
end
end
end
end
end
Это вывод:
Failures:
1) copy_stream copies the rest of an open file
Failure/Error: expect(IO.read(to.path)).to eq "a\nb\n"
expected: "a\nb\n"
got: "a\n"
(compared using ==)
Diff:
@@ -1,3 +1,2 @@
a
-b
[...]
2 examples, 1 failure
Failed examples:
rspec /workspaces/socbm378/johanabt/incstrip/spec/copy_stream_spec.rb:27 #
copy_stream copies the rest of an open file
Почему copy_stream
не удается скопировать остальную часть файла?
Я нашел простой обходной путь, но я хотел бы понять основную проблему.Вот мой обходной путь:
def copy_stream2(from, to)
while (buf = from.read(16 * 1024))
to.print buf
end
end