Reputation: 2616
I'm trying to create a new file and things don't seem to be working as I expect them to. Here's what I've tried:
File.new "out.txt"
File.open "out.txt"
File.new "out.txt","w"
File.open "out.txt","w"
According to everything I've read online all of those should work but every single one of them gives me this:
ERRNO::ENOENT: No such file or directory - out.txt
This happens from IRB as well as a Ruby script. What am I missing?
Upvotes: 211
Views: 275010
Reputation: 2914
There are several different options you could try. (This is not meant to be an exhaustive list... just tiring.)
File.new
file_name = File.new("out.txt", "w")
file_name.close
File.open
File.open("out.txt", "w") do |file|
#other stuff here
end
File.write
File.write('out.txt', 'contents here')
FileUtils.touch
require 'fileutils'
FileUtils.touch('out.txt')
IO.sysopen and IO.sysnew
fd = IO.sysopen("out.txt", "w")
file = IO.new(fd, "w")
file.puts "other stuff"
file.close
Tempfile
require 'tempfile'
tempfile = Tempfile.new('out')
tempfile.puts "some text"
tempfile.close
Pathname and open
require 'pathname'
path = Pathname.new("out.txt")
path.open("w") do |file|
file.puts "some text"
end
Chart source: How to write to a file in Ruby (Disclosure: I wrote it)
Upvotes: 1
Reputation: 6006
Use:
File.open("out.txt", [your-option-string]) do |f|
f.write("write your stuff here")
end
where your options are:
r
- Read only. The file must exist.w
- Create an empty file for writing.a
- Append to a file.The file is created if it does not exist.r+
- Open a file for update both reading and writing. The file must exist.w+
- Create an empty file for both reading and writing.a+
- Open a file for reading and appending. The file is created if it does not exist.In your case, 'w'
is preferable.
OR you could have:
out_file = File.new("out.txt", "w")
#...
out_file.puts("write your stuff here")
#...
out_file.close
... but that has the risk of forgetting to call close
(such as if an exception is raised, or you return
early).
Upvotes: 486
Reputation: 666
data = 'data you want inside the file'.
You can use File.write('name of file here', data)
Upvotes: 3
Reputation: 89793
Try using "w+"
as the write mode instead of just "w"
:
File.open("out.txt", "w+") { |file| file.write("boo!") }
Upvotes: 33
Reputation: 998
If the objective is just to create a file, the most direct way I see is:
FileUtils.touch "foobar.txt"
Upvotes: 18
Reputation: 160553
File.new
and File.open
default to read mode ('r'
) as a safety mechanism, to avoid possibly overwriting a file. We have to explicitly tell Ruby to use write mode ('w'
is the most common way) if we're going to output to the file.
If the text to be output is a string, rather than write:
File.open('foo.txt', 'w') { |fo| fo.puts "bar" }
or worse:
fo = File.open('foo.txt', 'w')
fo.puts "bar"
fo.close
Use the more succinct write
:
File.write('foo.txt', 'bar')
write
has modes allowed so we can use 'w'
, 'a'
, 'r+'
if necessary.
open
with a block is useful if you have to compute the output in an iterative loop and want to leave the file open as you do so. write
is useful if you are going to output the content in one blast then close the file.
See the documentation for more information.
Upvotes: 14
Reputation: 708
Try
File.open("out.txt", "w") do |f|
f.write(data_you_want_to_write)
end
without using the
File.new "out.txt"
Upvotes: 42
Reputation: 1920
The directory doesn't exist. Make sure it exists as open
won't create those dirs for you.
I ran into this myself a while back.
Upvotes: 10
Reputation: 185
You can also use constants instead of strings to specify the mode you want. The benefit is if you make a typo in a constant name, your program will raise an runtime exception.
The constants are File::RDONLY
or File::WRONLY
or File::CREAT
. You can also combine them if you like.
Full description of file open modes on ruby-doc.org
Upvotes: 0
Reputation: 2365
OK, now I feel stupid. The first two definitely do not work but the second two do. Not sure how I convinced my self that I had tried them. Sorry for wasting everyone's time.
In case this helps anyone else, this can occur when you are trying to make a new file in a directory that does not exist.
Upvotes: 21