Vikrant Chaudhary
Vikrant Chaudhary

Reputation: 11299

Modifying an IO stream in-place? Ruby

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?

Upvotes: 1

Views: 357

Answers (1)

intgr
intgr

Reputation: 20466

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.

Upvotes: 2

Related Questions