2009-11-15 89 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