Ruby的File.open无法创建文件

3

我正在尝试创建并写入一个新文件,使用的是

@logFile = File.open("C:\Users\---\Desktop\mylog.log", "w+")

什么也没有发生。我的程序使用

  @logFile.write ("Hello")
  @logFile.flush

这一行看起来运行得很好(没有崩溃或其他问题),但我看不到任何新创建的文件。

我错过了什么?


请参阅 IO 文档 中的开头部分,以及 Literals 文档中的 Strings 部分 - the Tin Man
2个回答

2
  1. 你的反斜线被转义了,在双引号括起来的字符串中,你需要将它们加倍,或者只使用Unix符号。所以:"C:\\Users\\---\\Desktop\\mylog.log"

或者 "C:/Users/---/Desktop/mylog.log"

或者 'C:\Users\---\Desktop\mylog.log'

  1. Ruby中的路径在Unix符号表示法中最安全,因此即使您为了复制而使用反斜杠,最好将其转换为Unix格式。

像这样 'C:\Users\---\Desktop\mylog.log'.gsub('\\','/')

这里也需要双重反斜杠,'和\需要使用单引号进行转义。

另一个与问题无关但非常方便的提示:使用块方法打开文件,以便清楚地知道何时关闭文件,请参见此示例

File.open(path, 'w') do |file|
  file.puts "Hello"
end

文件在结束后被关闭。
对于日志记录,可以看一下logger,使用过后你会爱不释手。

顺便说一下:我相信,当你运行你的脚本时,无论C:驱动器的工作目录是什么,现在应该实际上有一个名为Users---Desktopmylog.log的文件,由你原来有缺陷的代码版本创建。不过,我已经很久没有做过Windows编程了,所以我可能是错的。 - Jörg W Mittag
是的,在这种情况下没有错误,使用 everything.exe 进行搜索将显示 mylog.log 的位置,并使错误变得明显。 - peter
所有Ruby路径都需要使用Unix表示法吗?不是的。在Windows上,Windows风格的路径也可以。根据字符串的定义方式,分隔符可能需要进行转义。这在IO文档的开头有所涉及。nix风格的分隔符更方便,并且允许Ruby在Windows和nix系统之间透明地进行转换,但并非必需。 - the Tin Man
是的,作为一名Windows平台上的Ruby开发者,我过去在使用Windows风格路径时遇到了许多问题,因此养成了使用Unix风格路径的习惯。近年来,对Windows平台的支持明显增加,所以我会调整我的答案。 - peter
1
你应该使用 path = File.join("C:","Program Files","Blah") 来创建路径。 - whodini9

-1

你应该始终使用 path = File.join("C:","Program Files","Blah") 确保它在任何架构上都能正常工作。


这将在*nix上失败,因为它不知道"C:"。 - the Tin Man
我想我发帖的重点是,你应该始终使用File.join()来生成嵌套路径,而不是字符串。 - whodini9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接