I’m still learning ruby, so I’m sure I’m doing something wrong here, but using ruby 1.9.3 on windows, I’m having a problem writing a file with random ascii garbage to be a specific size. I need to be able to write these files for a test on an application I’m QAing. On Mac and on *nix, the file size is written correctly every time. But on windows, it generates files of random size, generally between 1,024 bytes and 1,031 bytes.
I’m sure the problem is one of the characters that the rstr is generating is counting as two characters but… it seems like this shouldn’t happen.
Here is my code:
num = 10
k = 1
for i in 1..num
fname = "f#{i}.txt"
f = File.new(fname, "w")
for k in 1..size
rstr = "#{(1..1024).map{rand(255).chr}.join}"
f.write rstr
print " #{rstr.size} " # this returns 1024 every time.
rstr = ""
end
f.close
end
Also tried:
opts = {}
opts[:encoding] = "UTF-8"
fname = "f#{i}.txt"
f = File.new(fname, "w", opts)
By default files open in Windows are open with text mode meaning that line endings and other details are adjusted.
If you want the files be written byte-to-byte exactly as you want, you need to open the files in binary mode:
The
bis a ignored on POSIX operating systems, so your scripts are now cross-platform compatible.Note: I used block syntax to manage the file so it properly closes and disposes the file handler once the block is executed. You no longer need to worry about closing the file 😉
Hope this helps.