如何确保StreamReader.BaseStream.Length返回正确的值

本文关键字:返回 Length BaseStream StreamReader 何确保 确保 | 更新日期: 2023-09-27 18:18:33

我有一个比较BaseStream.LengthlastMaxOffset的循环,假设10次中有9次运行正常。
但这是第一次BaseStream。长度不知何故设置为0 -在调试模式下它显示正常值,总是大于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 
    }
}

如何确保StreamReader.BaseStream.Length返回正确的值

您正在读取一个正在被另一个进程写入的文件。文件共享。ReadWrite给了你这样做的后门。这个过程没有义务让你的生活变得轻松。

您正在使用FileStream。长度,没有任何问题。它不做任何事情,只是用GetFileSize()向操作系统询问文件大小。您总是可以假设存在某种有缺陷的网络文件系统,但这不会给您带来任何好处。这里要做的正确假设是,您实际上看到了这个过程是做什么的。

它偶尔会截断文件。这时你会得到0。或者其他一些较小的数字,它不必是0,并且在您调试时,当进程继续写入文件时,它当然不必重复。

日志文件没什么特别的,它们不可能永远增长。您必须编写代码来适应这一点。很难做到100%正确,你不能依赖于一个可靠的长度值。当您获得一个小于前一个值的新值时,您可以做的唯一合理的事情是假设进程开始重写日志文件,因此您必须重新开始读取偏移量0(不是Length也不是lastMaxOffset)。强烈建议使用电话与该应用程序的程序员交谈,以验证这些假设。