tags:

views:

66

answers:

1

I've been writing a ruby programme that merges the content of two files. For example if a torrent have been downloaded two times separately, it tries to merge their contents for the blocks which have been completed.

So, I've been looking for a method which modifies a stream only at the place required and saves only that block instead of saving the whole stream again.

I'm reading the file in blocks of 16 KiBs, and how do I "replace" (not append) the content of that 16 KiBs so that only those bytes are written to disk and not the whole file is re-written each time!

Kind of,

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

Is there exists a method which achieves kind of that functionality?

+2  A: 

Open the file in "r+b" mode, seek to the location and just write to it:

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

This will overwrite 5 characters of the file, following offset 1024.

If the file is shorter than your seek offset, an appropriate number of null characters are inserted to the file.

intgr
That was easy! What have I been thinking? I even went through ruby-core docs.
Vikrant Chaudhary