Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby: No such file or directory @ rb_sysopen - testfile (Errno::ENOENT)

Tags:

file

ruby

I want to write something to a file.

# 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 

When this code is executed, I'm getting this error. I know this folder doesn't exist, but File.open with w mode creates a new file if it doesn't exist.

Why is this not working?

like image 971
ashwintastic Avatar asked Apr 01 '16 07:04

ashwintastic


2 Answers

Trying to use gets inside a rake task? You may be seeing this error message:

Errno::ENOENT: No such file or directory @ rb_sysopen

Did you try searching the error, and end up on this page? This answer is not for the OP, but for you.

Use STDIN.gets. Problem solved. That's because just using gets resolves back to $stdin.gets and rake is overriding the global variable so that gets tries to open a file handle that doesn't exist. Here's why:

What's the difference between gets.chomp() vs. STDIN.gets.chomp()?

like image 157
Day Davis Waterbury Avatar answered Oct 19 '22 20:10

Day Davis Waterbury


File.open(..., 'w') creates a file if it does not exist. Nobody promised it will create a directory tree for it.

Another thing, one should use File#join to build directory path, rather than dumb string concatenation.

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
like image 20
Aleksei Matiushkin Avatar answered Oct 19 '22 19:10

Aleksei Matiushkin