2009-11-15 40 views
2

我有一段時間檢查是否有更多的簡單文本文件讀取的StreamReader。它使用peek屬性。問題是,當我使用偷看時,位置發生了變化,所以不要假設。StreamReader,C#,偷看

FileStream m_fsReader = new FileStream(
         m_strDataFileName, 
         FileMode.OpenOrCreate, 
         FileAccess.Read, 
         FileShare.ReadWrite      ); 

StreamReader m_SR = new StreamReader(m_fsReader); 

Console.WriteLine("IfCanRead SR Position " + m_fsReader.Position + 
    " and Length " + m_fsReader.Length); 

if (m_SR.Peek() == -1) { 
     Console.WriteLine("IfCanRead false 2 SR Position " + 
      m_fsReader.Position + " and Length " + m_fsReader.Length); 

     return false; 
} 
else { 
     Console.WriteLine("IfCanRead true 2 SR Position " + 
      m_fsReader.Position + " and Length " + m_fsReader.Length); 

     return true; 
} 
+0

發佈您的相關代碼,因爲Peek不*消耗任何字節。這就是Peek的觀點。 – 2009-11-15 14:06:29

+0

添加相關數據 – 2009-11-15 14:13:46

+0

我假設你知道File.ReadAllBytes和其他類似的方法,但它們不能用於你的特定程序... – Will 2009-11-15 14:41:59

回答

5

自己測試了一下。底層FileStream的位置已經改變,但關鍵點在於,這並不意味着StreamReader實際上具有任何字節的消費。所以沒有問題。

+0

ConsoleWriteLine顯示這個 – 2009-11-15 14:18:41

+3

爲什麼地球上你會downvote誰嘗試幫助你,我不知道。 – 2009-11-15 14:36:20

+0

+1 - 這正是我想要創造的點。 – tvanfosson 2009-11-15 14:55:14

12

documentation表示StreamReader的位置沒有改變,但是您正在檢查基礎流的當前位置,而不是讀取器本身的位置。我沒有看到它確保底層流的位置保持不變。事實上,我懷疑它只是讀取它並在內部進行緩衝,以使讀者的光標保持在之前的位置。這意味着它不能保證底層流的位置不變。

Peek不改變StreamReader對象的當前位置。如果當前沒有更多字符可用,則返回值爲-1。

+0

不,我正在檢查StreamReader處理程序。 – 2009-11-15 14:26:46

+1

您的代碼顯示您正在打印出流的位置,而不是流讀取器。我知道你在讀者面前打電話給Peek,但看起來你認爲它離開了同一位置,但文件只是說它保留了讀者的位置不變。我將編輯,以便您可以刪除您的錯誤downvote。 – tvanfosson 2009-11-15 14:29:15

+0

+1。你精心設計的答案不值得一個負分。 – 2009-11-15 14:57:18