2012-07-19 99 views
1

我还在学习ruby,所以我敢肯定我在这里做错了什么,但在Windows上使用ruby 1.9.3,我有一个问题,写一个随机ascii垃圾文件是一个特定的大小。我需要能够编写这些文件在我正在QAing的应用程序上进行测试。在Mac和* nix上,每次都会正确写入文件大小。但在Windows上,它会生成随机大小的文件,通常介于1,024字节和1,031字节之间。Ruby文件写入窗口返回错误的文件大小?

我敢肯定,问题是rstr正在生成的字符之一计算为两个字符,但是......似乎这不应该发生。

这里是我的代码:

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 

也试过:

opts = {} 
    opts[:encoding] = "UTF-8" 
    fname = "f#{i}.txt" 
    f = File.new(fname, "w", opts) 

回答

2

默认情况下,在Windows中打开的文件打开为文本模式这意味着行结束和其他细节被调整。

如果你想要的文件被写入字节到字节完全按照你想要的,你需要在二进制模式打开文件:

File.new("foo", "wb") do |f| 
    # ... 
end 

b是POSIX操作系统上忽略,所以你的脚本现在是跨平台兼容的。

注意:我使用块语法来管理文件,以便在块执行后正确关闭和配置文件处理程序。您不再需要担心关闭文件;-)

希望这会有所帮助。

+0

Luis,这真是个诀窍,谢谢! – 2012-07-19 16:51:29

0

没有任何255个ASCII。值从0到254。 如果您尝试打印f 255.chr,您将得到一个多字节字符。由于Windows不标准utf-8,你会得到不正确的值。因此,你面临的问题!

尝试在文件顶部添加#coding: utf-8。它应该让事情工作。

+0

实际上'size'应该返回相同的值,无论它分析单字节还是多字节字符。我想我错了。 **编辑**:实际上,Ruby不会在Windows中使用标准的utf-8编码。如果您在文件顶部添加#coding:utf-8,则应该正确。我会将其添加到答案中。 – 2012-07-19 15:40:34

+0

谢谢安德烈。尽管如此,仍然没有工作。 :( – 2012-07-19 16:04:26