2011-07-15 19 views
1

當試圖刪除目錄(+內容)並在讀取裏面的文件後,FileUtils.rm_rf(path)不會刪除所有文件夾,儘管它確實刪除了所有文件並且一些的文件夾。使用File.open塊後無法刪除Dir/Files塊

經過一番實驗後,它似乎與File.open塊有關。 (其實我做塊內正則表達式匹配,但我只是用放這裏讓事情變得清晰)

File.open(file).each do |line| 
    puts line 
end 

從我讀過的東西,上面應自動關閉該文件,但使用這個時,FileUtils無法完成其任務。

但是,如果我使用下面的代碼,FileUtils按需要工作。

open_file = File.open(file) 
open_file.each do |line| 
    puts line 
end 
open_file.close 

在第二個例子中使用代碼沒什麼大不了的,但我更喜歡第一個例子的清潔。

爲什麼第一個例子會破壞FileUtils?

P.S.我對Ruby和Stack Overflow都很陌生....嗨。我的系統是Ubuntu的11.04(64位),運行RVM使用Ruby 1.9.2-P180

+0

當我通過文件名時,我實際上是通過了整個路徑; /media/drive/filea/a.html。我在目錄「filea」中做的唯一事情是運行一個Dir.glob(「#{path}/**/*」)來獲取文件名列表(a.html等) - 也許是這樣的。我明天會做一個測試。 –

回答

1

你應該使用這樣的事情:

File.open(file) do |f| 
    f.each{|line| puts line} 
end 

在你的榜樣塊被提供給每個方法和在沒有塊的情況下打開的版本被執行,返回一個調用每個方法的IO對象。

+0

當我嘗試這個時,我在.each上遇到錯誤。在稍微檢查一下後,似乎在使用'File.open(file).each do | line |'時,它實際上遍歷文件的每一行。使用'puts「 - #{line}」''的進一步測試將顯示每行以兩個破折號作爲前綴的行。 –

+0

你的代碼的問題是'File.open(file).each do | line |'不會在事後關閉文件。原因是'File.open'只在給定塊時關閉文件。在你的情況下,該塊被賦予「each」而不是「open」。 –

+0

謝謝obrok,我完全錯過了,我仍然把它傳遞給'each'。 –