1. ホーム
  2. ruby

[解決済み】そのようなファイルやディレクトリはありません @ rb_sysopen ruby

2022-02-01 15:17:33

質問

フォルダ内にファイルが存在するにもかかわらず、以下のような問題が発生します。

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

解決方法は?

その file_name は改行文字を含んでいます \n を末尾につけると、印刷されないがパスが乱れる。を削除することでこの問題を解決できます。 line を最初に指定します。

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

コードのデバッグ時に注意するのは puts . その引用は ドキュメンテーション を見ると、醜い真実が見えてくる。

与えられたオブジェクトをiosに書き込みます。 改行で終わっていないものの後に改行を書きます。

別の言い方をすれば、オブジェクトの末尾にある(可能性のある)改行文字は無視されます。そのため、ファイル名が実際には SVNFolders.txt\n .

を使う代わりに puts を使用することができます。 p は、トラブルシューティングの際に使用します。この2つを簡単に比較すると puts コール to_s と改行が追加されるのに対し p を呼び出します。 inspect をオブジェクトに追加します。以下は、その違いについてもう少し詳しく説明します。 http://www.garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/