2009-11-24 2 views
1

Я писал рубиновую программу, которая объединяет содержимое двух файлов. Например, если торрент был загружен два раза отдельно, он пытается объединить их содержимое для блоков, которые были завершены.Изменение потока ввода-вывода на месте? Ruby

Итак, я искал метод, который изменяет поток только в нужном месте и сохраняет только этот блок вместо сохранения всего потока снова.

Я читаю файл в блоках из 16 KiBs и как мне «заменить» (не добавлять) содержимое этих 16 KiB, чтобы только эти байты записывались на диск, а не весь файл, каждый раз писать!

Вид,

#Doesn't exist unfortunately. 
#By default it appends instead of replacing, so file size grows. 
IO.write(file_name, content, offset, :replace => true) 

ли существует метод, который достигает своего рода этой функциональности?

+0

Код здесь, если кому интересно. - http://code.google.com/p/vikrant-incubator/source/browse/ruby/merge_incomplete.rb –

ответ

2

Открыть файл в режиме "r+b", обратитесь к месту и просто писать:

f=File.new("some.existing.file", "r+b"); 
f.seek(1024); 
f.write("test\n"); 
f.close() 

Это будет перезаписывать 5 символов из файла, после смещения 1024.

Если файл короче чем ваше смещение поиска, в файл вставляется соответствующее число нулевые символы.

+0

Это было просто! О чем я думал? Я даже просмотрел рубиновые документы. –

Смежные вопросы