web-dev-qa-db-ja.com

Errno :: ENOENT(そのようなファイルまたはディレクトリはありません@ rb_sysopen

ファイルに何かを書きたい。

# where userid is any intger [sic]
path = Rails.root + "public/system/users/#{user.id}/style/img.jpg" 
File.open(path, 'wb') do |file|
  file.puts f.read
end 

このコードを実行すると、このエラーが発生します。このフォルダが存在しないことは知っていますが、File.open with wモードは、新しいファイルが存在しない場合に作成します。

なぜこれが機能しないのですか?

21
ashwintastic

File.open(..., 'w')は、ファイルが存在しない場合にファイルを作成します。ディレクトリツリーを作成すると約束した人はいませんでした。

もう1つ、 File#join 単純な文字列連結ではなく、ディレクトリパスを構築します。

path = File.join Rails.root, 'public', 'system', 'users', user.id.to_s, 'style'

FileUtils.mkdir_p(path) unless File.exist?(path) 
File.open(File.join(path, 'img.jpg'), 'wb') do |file|
  file.puts f.read
end
23

レーキタスク内でgetsを使用しようとしていますか?次のエラーメッセージが表示される場合があります。

Errno :: ENOENT:そのようなファイルまたはディレクトリはありません@ rb_sysopen

エラーを検索してみましたが、このページで終わりましたか?この答えはOPのためではなく、あなたのためです。

STDIN.getsを使用します。問題が解決しました。単にgetsを使用すると$stdin.getsに戻り、rakeはグローバル変数をオーバーライドして、getsが存在しないファイルハンドルを開こうとするためです。その理由は次のとおりです。

gets.chomp()とSTDIN.gets.chomp()の違いは何ですか?

35