【发布时间】:2016-01-18 21:45:29
【问题描述】:
我有一个循环将BaseStream.Length 与lastMaxOffset 进行比较,假设10 次中有9 次运行正常。
但这是 BaseStream.Length 以某种方式设置为 0 的 1 次 - 在调试模式下它显示正常值,始终大于 0 - 这导致我的控制台应用程序出现问题。
我验证了长度不等于 0,因为它是一个只会增长的日志文件。所以我猜这是一个 BaseStream 问题(可能暂时没有长度值,所以将其设置为 0)
有没有办法确保StreamReader.BaseStream.Length 只返回正确的值?
using (StreamReader reader = new StreamReader(
new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite),
Encoding.Default))
{
long lastMaxOffset = this.getMaxOffsetForFile(path);
if ( lastMaxOffset == 0 )
{
lastMaxOffset = this.setMaxOffsetForFile(path, reader.BaseStream.Length);
}
reader.DiscardBufferedData();
long fileLength = reader.BaseStream.Length;
if (fileLength > lastMaxOffset)
{
//my code
}
}
【问题讨论】:
-
@CodeCaster 我已经看过这篇文章,实际上我在我的代码阅读器上添加了。DiscardBufferedData();因为flush是针对StreamWriter的,但是还是会报错。
-
然后修复您的问题中的
StreamWriter。无论如何,阅读器也会缓冲。 -
我认为
StreamReader.BaseStream属性是框架中的设计错误。这根本不应该暴露。 -
@usr 你能建议一种方法来确保我能得到正确的值吗?正如我所说,不能正常运行的情况很少见,但我应该排除这种可能的错误
标签: c# streamreader content-length