Truncating a File
Problem
You want to truncate a file to a certain length, probably zero bytes.
Solution
Usually, you want to destroy the old contents of a file and start over. Opening a file for write access will automatically truncate it to zero bytes, and let you write new contents to the file:
filename = 'truncate.txt' open(filename, 'w') { |f| f << "All of this will be truncated." } File.size(filename) # => 30 f = open(filename, 'w') {} File.size(filename) # => 0
If you just need to truncate the file to zero byt es, and not write any new contents to it, you can open it with an access mode of File::TRUNC.
open(filename, 'w') { |f| f << "Here are some new contents." } File.size(filename) # => 27 f = open(filename, File::TRUNC) {} File.size(filename) # => 0
You can't actually do anything with a FILE whose access mode is File::TRUNC:
open(filename, File::TRUNC) do |f| f << "At last, an empty file to write to!" end # IOError: not opened for writing
Discussion
Transient files are the most likely candidates for truncation. Log files are often truncated, automatically or by hand, before they grow too large.
The most common type of truncation is truncating a file to zero bytes, but the File.truncate method can truncate a file to any number of bytes, not just zero. You can also use the instance method, File#truncate, to truncate a file you've opened for writing:
f = open(filename, 'w') do |f| f << 'These words will remain intact after the file is truncated.' end File.size(filename) # => 59 File.truncate(filename, 30) File.size(filename) # => 30 open(filename) { |f| f.read } # => "These words will remain intact"
These methods don't always make a file smaller. If the file starts out smaller than the size you give, they append zero-bytes ( 00) to the end of file until the file reaches the specified size.
f = open(filename, "w") { |f| f << "Brevity is the soul of wit." } File.size(filename) # => 27 File.truncate(filename, 30) File.size(filename) # => 30 open(filename) { |f| f.read } # => "Brevity is the soul of wit. 00 00 00"
File.truncate and File#truncate act like the bed of Procrustes: they force a file to be a certain number of bytes long, whether that means stretching it or chopping off the end.