我有一個應用程序,它可以處理一堆文本文件。目前,我有這樣的代碼(剪切在一起的摘錄):FileInfo.Length大於0但文件爲空?
FileInfo info = new FileInfo(...)
if (info.Length > 0) {
string content = getFileContents(...);
// uses a StreamReader
// returns reader.ReadToEnd();
Debug.Assert(!string.IsNullOrEmpty(contents)); // FAIL
}
private string getFileContents(string filename)
{
TextReader reader = null;
string text = "";
try
{
reader = new StreamReader(filename);
text = reader.ReadToEnd();
}
catch (IOException e)
{
// File is concurrently accessed. Come back later.
text = "";
}
finally
{
if (reader != null)
{
reader.Close();
}
}
return text;
}
爲什麼我得到一個失敗的斷言? FileInfo.Length屬性已用於驗證該文件是否爲空。
編輯:這似乎是一個錯誤 - 我捕捉IO異常並返回空字符串。但是,由於圍繞fileInfo.Length()進行了討論,下面是一些有趣的內容:fileInfo.Length返回2表示一個空的,唯一的BOM標記文本文件(在記事本中創建)。
也許該文件只包含BOM?但是這個問題可能在你沒有發佈的getFileContents函數中。理論上競爭條件也是可能的,但在實踐中不太可能。文件失敗的內容是什麼? – CodesInChaos 2010-10-14 17:38:44
我會檢查。它發生了幾次,所以我認爲這是一個錯誤。這不太可能是一種競爭條件,因爲文件輸入代碼是單線程的,我目前不在該驅動器上編輯文件。我還在文件打開時捕獲IO異常並跳過該文件。 – ashes999 2010-10-14 19:18:42
另外,BOM返回一個非零長度,但ReadToEnd()給我們一個空字符串;看到更新的問題。 – ashes999 2010-10-14 19:47:32