2016-04-01 67 views
7

我想写的东西到一个文件中。变量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.openw模式创建一个新的文件,如果它不存在。

这是为什么不工作?

回答

12

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 
+0

只是好奇:为什么是File.join可取吗?它总是将路径组件连接到平台特定的分隔符(例如,Windows上的'\')。虽然**有**情况,我们希望在所有平台上都使用'/',因为这样可以减少可移植性问题。在这里发布的代码的情况下,我不明白为什么平台特定的文件分隔符可能是一个优势。 – user1934428

+1

@ user1934428“我们通常试图坚持/在所有平台上,因为这样可以减少便携性方面的令人头疼的问题。” - 这是无稽之谈,使用File.join有助于避免类似于OP中的愚蠢错误: Rails.root'不以斜线结尾,并使用'+'给出'/ railsrootpublic /'(注意上面的斜线缺失)。 – mudasobwa

+0

@mudasobwa:在我的Rails控制台中Rails.root +“bla/bla” GIves correct路径:) – ashwintastic

14

试图在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()?

+0

这也适用于'gets'使用一个流浪文件。 – bschlueter

+3

你在做上帝的工作 – user3062913

相关问题