这适用于Unix,但是当我将它移动到Windows 7(运行脚本的机器)时,使用Ruby 2.1和2.2,它都会失败。
这适用于(在Windows上):
date = Time.new.localtime.to_s
file = File.new("somefile #{1 + 1}", 'a')
file.close
这不起作用(在Windows上):
date = Time.new.localtime.to_s
file = File.new("somefile #{date}", 'a')
file.close
产生的错误是:
test.rb:2:in 'initialize': Invalid argument @ rb_sysopen - somefile 2015-12-07 11:17:52 -0500 (Errno::EINVAL)
from test.rb:2:in 'new'
from test.rb:2:in '<main>'
关于为什么会出现这种情况的任何想法?
答案 0 :(得分:1)
时间在这里是一个红鲱鱼。问题是Windows上的文件名中不允许使用冒号字符(:
)。来自MSDN:
使用当前代码页中的任何字符作为名称,包括 扩展字符集中的Unicode字符和字符 (128-255),但以下情况除外:
- 以下保留字符:
<
(小于)>
(大于):
(冒号)"
(双引号)/
(正斜杠)\
(反斜杠)|
(垂直条或竖线)?
(问号)*
(星号)- 整数值为零,有时也称为ASCII NUL 字符。
- 整数表示形式在1到31范围内的字符,但这些字符的备用数据流除外 被允许。有关文件流的更多信息,请参阅文件 流。
- 目标文件系统不允许的任何其他字符。
来源:https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
一种解决方案是使用Time#strftime
输出不带有违规冒号的字符串,例如:
date = Time.new.localtime.strftime("%F %H.%M.%S %z")
file = File.new("somefile #{date}", 'a')
# => #<File:somefile 2015-12-07 11.17.52 -0500>
或者,看一下关于清理字符串以用作文件名的主题的SO答案:How to make a Ruby string safe for a filesystem?
答案 1 :(得分:0)
Time.new.localtime
查找您系统的ENV['TZ']
变量,该变量可能未在Windows 7中设置。
您可以点按此链接在Windows上设置ENV['TZ']
:how to set "TZ" environment variable at system level
来源:http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html#method-i-localtime