Errno :: ENOENT(没有这样的文件或目录@ rb_sysopen

时间:2016-04-01 07:22:06

标签: ruby 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 

执行此代码时,我收到此错误。我知道此文件夹不存在,但File.open w模式会创建一个新文件,如果它不存在。

为什么这不起作用?

4 个答案:

答案 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

仅此而已。

我希望这会有所帮助