我正在使用QTextStream寫入QFile,並且所有工作都很好。我試圖創建一些錯誤檢測,所以我試圖在寫入之間刪除輸出文件。QFile/QTextStream在正在寫入的刪除文件上不顯示錯誤
扼殺,Qtextstream的狀態繼續顯示爲0(沒有錯誤),和一個QFile的錯誤方法返回0。然而,這個文件已經一去不復返了,書面文本正在消失......走了
這是怎麼回事?我如何檢測寫入失敗?我在看錯方法嗎?
我正在使用QTextStream寫入QFile,並且所有工作都很好。我試圖創建一些錯誤檢測,所以我試圖在寫入之間刪除輸出文件。QFile/QTextStream在正在寫入的刪除文件上不顯示錯誤
扼殺,Qtextstream的狀態繼續顯示爲0(沒有錯誤),和一個QFile的錯誤方法返回0。然而,這個文件已經一去不復返了,書面文本正在消失......走了
這是怎麼回事?我如何檢測寫入失敗?我在看錯方法嗎?
不確定Windows,但在Linux和大多數Unix類型的系統上,從操作系統的角度來看,您描述的場景根本不是錯誤 - 繼續寫入已刪除的文件是完全合法的(並且「有效」,數據仍然在文件系統中進行混洗 - 該文件在文件系統中仍然存在,直到最後一個句柄關閉爲止)。
(我相信,在Windows上,如果您嘗試刪除該文件,而它在使用中,至少如果它是用默認打開方式打開,你會得到一個錯誤 - 不是100%肯定雖然)
如果您需要檢查「文件已刪除」,您需要自己編寫這些檢查。
我將如何檢查文件刪除? (這是在Linux下)。是否有一個與Qfile相關的函數告訴我這個文件仍然存在(不只是一個具有相同名稱的文件)?我的恐懼是,因爲這是一個日誌文件,logrotate(或類似的東西)有可能會創建一個相同名稱的文件...所以我需要檢查這個文件... – TSG
這實際上很難做到這一點。一種方法是使用'handle()'來獲取底層的C文件描述符和'fstat'。如果'st_nlink'爲零,則文件被刪除(在fs層次結構中不可見)。如果非零(文件可能已被移動),則將'st_dev'和'st_ino'與文件名的'stat()'進行比較。如果它們不匹配,則文件已被「旋轉」。我相信logrotate可以設置爲在應用程序完成其工作時嚮應用程序發送信號。這可能是解決這個問題的最好辦法。 – Mat
哦,另外一個不用擔心的方法是在需要登錄時重新打開文件。除非你有很高的登錄率,否則這很可能是最好的解決方案@Michelle。 – Mat
顯示至少刪除和回寫的代碼部分。 – Arun