2010-10-14 40 views
3

我有一個應用程序,它可以處理一堆文本文件。目前,我有這樣的代碼(剪切在一起的摘錄):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標記文本文件(在記事本中創建)。

+0

也許該文件只包含BOM?但是這個問題可能在你沒有發佈的getFileContents函數中。理論上競爭條件也是可能的,但在實踐中不太可能。文件失敗的內容是什麼? – CodesInChaos 2010-10-14 17:38:44

+0

我會檢查。它發生了幾次,所以我認爲這是一個錯誤。這不太可能是一種競爭條件,因爲文件輸入代碼是單線程的,我目前不在該驅動器上編輯文件。我還在文件打開時捕獲IO異常並跳過該文件。 – ashes999 2010-10-14 19:18:42

+0

另外,BOM返回一個非零長度,但ReadToEnd()給我們一個空字符串;看到更新的問題。 – ashes999 2010-10-14 19:47:32

回答

2

看到catch (IOException)塊你有嗎?這就是返回一個空字符串並觸發斷言,即使該文件不是空的。

+0

賓果。完成我的監督。 – ashes999 2010-10-14 19:40:19

5

除了字節順序標記,您可能有一個空的文件。我認爲TextReader.ReadToEnd()將刪除字節順序標記,給你一個空字符串。

或者,該文件可能在檢查長度和讀取它之間被截斷。

出於診斷目的,我建議您在得到空字符串時記錄文件長度。

+0

將嘗試記錄。 – ashes999 2010-10-14 19:18:59

+0

你對這個斜體思想是正確的。除非你明確地打開它作爲像US-ASCII這樣的BOMless編碼,否則它會吃掉BOM(事實上它應該)。 – 2010-10-14 19:34:50

+0

僅含BOM的文件將返回非零長度,但ReadToEnd()會給出空白內容;看到更新的問題。 – ashes999 2010-10-14 19:48:03

0

如果我沒記錯,文件以文件結尾結束,當您調用ReadToEnd時,文件不會被包含。

因此,文件大小不是0,但它的內容大小是。

+0

不,EOF只能由控制檯處理,而不能由StreamReader處理。請參閱我的快速測試:http://pastebin.com/mhjr8yrV – Lucero 2010-10-14 17:53:49

+0

是的,但是,我們正在談論FileInfo.Length,它是完整的文件長度,而不是流讀取器的長度。我相當肯定他們不相等(這個問題似乎證明了這一點) – Eilistraee 2010-10-14 18:49:28

+0

@Lucero我不太瞭解你的pastebin示例。 – ashes999 2010-10-14 19:20:00

0

什麼在getFileContents方法?

在調用ReadToEnd()之前,它可能會將流的指針重新定位到流尾。

相關問題