Ruby文件在Windows中写入返回错误的文件大小?

时间:2012-07-19 15:31:44

标签: ruby windows file-io

我还在学习ruby,所以我确定我在这里做错了,但在windows上使用ruby 1.9.3,我在编写带有随机ascii垃圾的文件时遇到问题。我需要能够在我正在测试的应用程序上编写这些文件进行测试。在Mac和* nix上,每次都正确写入文件大小。但是在Windows上,它会生成随机大小的文件,通常介于1,024字节和1,031字节之间。

我确定问题是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 个答案:

答案 0 :(得分:2)

默认情况下,在Windows中打开的文件以文本模式打开,这意味着会调整行结尾和其他详细信息。

如果您希望文件按照您想要的方式逐字节写入,则需要以二进制模式打开文件:

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

在POSIX操作系统上忽略了b,因此您的脚本现在可以跨平台兼容。

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

希望这有帮助。

答案 1 :(得分:0)

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

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