我想写一些文件。
# 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
w
模式会创建一个新文件,如果它不存在。
为什么这不起作用?
答案 0 :(得分:31)
尝试在rake任务中使用gets
?您可能会看到此错误消息:
Errno :: ENOENT:没有这样的文件或目录@ rb_sysopen
您是否尝试搜索错误,并在此页面上结束?这个答案不适用于OP,而是适合你。
使用STDIN.gets
。问题解决了。这是因为仅使用gets
会解析回$stdin.gets
并且rake会覆盖全局变量,以便gets
尝试打开不存在的文件句柄。这就是原因:
What's the difference between gets.chomp() vs. STDIN.gets.chomp()?
答案 1 :(得分:19)
File.open(..., 'w')
会创建一个文件。没有人承诺会为它创建一个目录树。
另一方面,应该使用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
答案 2 :(得分:0)
当 File.open(..., 'w')
无法打开文件时,即由于 Windows 10 下的受保护文件夹访问权限,您也会收到此错误。
答案 3 :(得分:0)
我在尝试用 Ruby 创建文件时遇到了这个问题。
我试图使用下面的命令来创建一个新文件:
File.new("testfile", "r")
和
File.open("testfile", "r")
但后来我收到以下错误:
<块引用>(irb):1:in `initialize': 没有那个文件或目录@rb_sysopen - testfile (Errno::ENOENT)
这是我修复它的方法:
问题是我没有为文件指定正确的模式。创建新文件的格式为:
File.new(filename, mode)
或
File.open(filename, mode)
各种模式是:
"r" Read-only, starts at beginning of file (default mode).
"r+" Read-write, starts at beginning of file.
"w" Write-only, truncates existing file
to zero length or creates a new file for writing.
"w+" Read-write, truncates existing file to zero length
or creates a new file for reading and writing.
"a" Write-only, each write call appends data at end of file.
Creates a new file for writing if file does not exist.
"a+" Read-write, each write call appends data at end of file.
Creates a new file for reading and writing if file does
not exist.
但是,我的命令 File.new("testfile", "r")
使用了 "r" Read-only
模式,该模式试图从名为 testfile
的现有文件中读取数据,而不是创建一个新文件。我所要做的就是修改命令以使用 "w" Write-only
模式:
File.new("testfile", "w")
或
File.open("testfile", "w")
参考资料:File in Ruby
仅此而已。
我希望这会有所帮助