2016-04-01 68 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

相關問題