字符串中的Time.new EINVAL错误,仅限Windows,rb_sysopen

时间:2015-12-07 16:26:12

标签: ruby

这适用于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>'

关于为什么会出现这种情况的任何想法?

2 个答案:

答案 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