Ruby IO.copy_stream не взаимодействует должным образом с readline? - PullRequest
0 голосов
/ 20 декабря 2018

В сценарии 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...