【问题标题】:No such file or directory @ rb_sysopen ruby没有这样的文件或目录@rb_sysopen ruby
【发布时间】:2021-12-31 20:48:44
【问题描述】:

即使文件存在于文件夹中,也面临以下问题。

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>'

输入文件 (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

代码:

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

我尝试过同时使用正斜杠和反斜杠,但没有成功。我缺少什么,不确定。谢谢。

puts file_name 给出以下值

SVNFolders.txt
post-commit.bat
customemail.txt
ReadMe.txt

【问题讨论】:

  • 在输入文件中,提到的文件名有空格,如“SVN Folders.txt”,但在错误中,同一文件读为“SVNFolders.txt”。你的文件名有空格吗?
  • 让我直说...H:/Ruby_test_works:input.txt 中只有 一个文件。该文件包含四行文本,每行以另一个文件名结尾。然后您尝试打开该文件...但是该文件不存在。这是您的错误信息。没有像H:/Ruby_test_works/SVNFolders.txt 这样的文件。那么你的问题到底是什么?
  • @Ucpuzz :抱歉,这是一个复制和粘贴问题。文件没有命名空间
  • @TomLord :如果问题令人困惑,我深表歉意。 input.txt 文件有 3 列,例如第 1 列 - 现有值,第 2 列:要替换的值,第 3 列是必须进行替换的文件名。下面有 5 个文件:H:/Ruby_test_works 包括 input.txt> 我正在循环遍历 input.txt 的每一行,并获取要在其他 4 个文件上替换的值。
  • 您是否尝试在第 7 行使用File.open 而不是File.read?另外我在File.read 上找不到文档。您使用的是什么版本的 ruby​​?

标签: ruby


【解决方案1】:

file_name 末尾包含换行符 \n,它不会被打印出来,但会弄乱路径。您可以通过先删除 line 来解决此问题:

initial, final, file_name = line.strip.split("\t")

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

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

另一种说法是它忽略了对象末尾的(潜在的)换行符。这就是为什么你从来没有看到文件名实际上是SVNFolders.txt\n。

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

【讨论】:

  • 非常感谢您的洞察力。对于 puts 与 p 的使用 +1。
【解决方案2】:

有时问题不是文件,而是文件的路径。考虑将文件路径与您认为的文件路径进行比较:

File.expand_path('my_file.rb')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 2015-05-11
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多