没有这样的文件或目录@ rb_sysopen ruby

Gok*_*oku 1 ruby

即使文件夹中存在该文件,也要面对以下问题。

H:\Ruby_test_works>ruby hurrah.rb
hurrah.rb:7:in `read': No such file or directory @ rb_sysopen - H:/Ruby_
test_works/SVNFolders.txt (Errno::ENOENT)
        from hurrah.rb:7:in `block in <main>'
        from hurrah.rb:4:in `each_line'
        from hurrah.rb:4:in `<main>'
Run Code Online (Sandbox Code Playgroud)

输入文件(input.txt)列之间用制表符分隔。

10.3.2.021.asd  10.3.2.041.def  SVNFolders.txt
SubversionNotify    Subversionweelta    post-commit.bat
Commit message  still rake  customemail.txt
mckechney.com   yahoo.in    ReadMe.txt
Run Code Online (Sandbox Code Playgroud)

代码:

dir = 'H:/Ruby_test_works'
file = File.open("#{dir}/input.txt", "r")

file.each_line do |line|
  initial, final, file_name = line.split("\t")
  #puts file_name
  old_value = File.read("#{dir}/#{file_name}")

  replace = old_value.gsub( /#{Regexp.escape(initial)}, #{Regexp.escape(final)}/)
  File.open("#{dir}/#{file_name}", "w") { |fi| fi.puts replace }

end
Run Code Online (Sandbox Code Playgroud)

我尝试过使用正斜杠和反斜杠,但没有运气。我所缺少的,不确定。谢谢。

puts file_name 给出以下值

SVNFolders.txt
post-commit.bat
customemail.txt
ReadMe.txt
Run Code Online (Sandbox Code Playgroud)

jdn*_*dno 6

file_name包含换行字符\n结尾,这将不会打印,但食堂的路径。您可以通过删除第line一个来解决此问题:

initial, final, file_name = line.strip.split("\t")
Run Code Online (Sandbox Code Playgroud)

调试代码时,请注意puts。引用其文档揭示了一个丑陋的事实:

将给定的对象写入ios。在尚未以换行符序列结尾的任何内容之后写入换行符。

另一种表达方式是说它忽略了对象末尾的(潜在)换行符。这就是为什么您从未看到文件名实际上是SVNFolders.txt\n

在解决问题时puts,可以使用而不是使用p。两者之间的简短比较是,在对对象进行调用时,puts调用to_s并添加了换行符。以下是有关差异的更多详细信息:http : //www.garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/pinspect