2012-10-19 40 views
1

我有以下的Ruby/Rails代碼:如何確定文件已寫入?

file = File.new("#{folder}/conf.txt", 'a+') 
file.write(content) 
file.close 

的問題是,不時被創建這個文件,但它是空的,而我敢肯定,內容變量是不是空的(它在另一部分用於的代碼也)。

我該如何確定該文件已被寫入?由於這是我應用程序中的一個重要步驟,如果無法寫入,我希望得到一個異常或某種錯誤。

+3

我很確定如果數據沒有被寫入,Ruby會拋出一些錯誤。 – Dogbert

+1

如果該代碼執行,您將寫入內容到「#{folder} /conf.txt」。我懷疑,如果它偶爾沒有被寫入,那麼真正發生的是你在'File.new'或'#write'上拋出了一個異常,並在其他地方默默地拯救了它。以這種方式定位的某些文件夾是否有權限問題,阻止您的rails用戶在其中打開文件? – dbenhur

+0

@Fernando爲什麼不尋求最後一行和比較它,文件大小比較也會做 – Viren

回答

3

從原始數據開始往返,寫入文件,然後從文件中讀取數據。如果它與原始內容相匹配,則可以確定。

+1

雖然這個建議是檢查文件是否寫入的好方法,但它沒有解決OP代碼如何失敗的更深層次的問題。 – dbenhur

0

感謝大家誰回答這個問題,遺憾的缺乏關注,但我張貼開始注意到這樣一個在Apache日誌錯誤(我使用客運+ Apache)的問題後第1天:

[ pid=21526, timestamp=1350608946 ] Process aborted! signo=SIGABRT(6), reason=SI_TKILL, signal sent by PID 21526 with UID 0, backtrace available. 
-------------------------------------- 
[ pid=21526 ] Backtrace with 34 frames: 
PassengerHelperAgent[0x525668] 
/lib64/libpthread.so.0(+0xf4c0)[0x7fcabb2014c0] 
/lib64/libc.so.6(gsignal+0x35)[0x7fcaba7059a5] 
/lib64/libc.so.6(abort+0x175)[0x7fcaba707185] 
big backtrace... 

我搜索了這個問題,但找不到任何有類似問題/回溯的人。

他們,我決定搬到Passenger + Nginx。

1周後,問題已經消失。過去每天發生一次或兩次的事情,Nginx並沒有發生過一次。相同的代碼(根本沒有更新)和同一臺機器。

雖然我不能重現這個問題,但在我調查的時候,我用「File.close」方法做了幾次測試。只要無法寫入文件,它就會拋出異常。

不幸的是我沒有足夠的經驗來挖掘這個問題,我對Nginx + Passenger很滿意。