如何确保 StreamReader.BaseStream.Length 会 return 正确的值?
How to ensure that StreamReader.BaseStream.Length will return the correct value?
我有一个循环将 BaseStream.Length
与 lastMaxOffset
进行比较,假设 10 次中有 9 次运行正常。
但这 1 次 BaseStream.Length 以某种方式设置为 0 - 在调试模式下它显示正常值,始终大于 0 - 这导致我的控制台应用程序出现问题。
我验证了长度不等于 0,因为它是一个只会增长的日志文件。所以我猜这是一个BaseStream问题(可能暂时没有长度值,所以它设置为0)
有没有办法确保 StreamReader.BaseStream.Length
只会 return 正确的值?
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
}
}
您正在读取一个正在被另一个进程写入的文件。 FileShare.ReadWrite 给了你执行此操作的后门。该过程没有义务让您的生活变得轻松。
您正在使用 FileStream.Length,没有任何问题。除了使用 GetFileSize() 向操作系统询问文件大小外,它什么都不做。您总是可以假设某种有缺陷的网络文件系统,但这并不能使您到达任何地方。此处做出的正确假设是您实际上看到了这个过程的作用。
它偶尔会截断文件。发生这种情况时你会得到 0。或者其他一些小数字,它不一定是 0,并且在进程继续写入文件的同时进行调试时当然不必重复。
日志文件没什么特别的,它们不会永远增长。您必须编写代码来适应这一点。很难做到 100% 正确,您不能依赖可靠的长度值。当您获得一个小于前一个值的新值时,您可以做的唯一合理的事情是假设进程开始重写日志文件,因此您将不得不再次开始读取偏移量 0(不是 Length 也不是 lastMaxOffset)。强烈建议使用电话与此应用程序的程序员交谈以验证这些假设。
我有一个循环将 BaseStream.Length
与 lastMaxOffset
进行比较,假设 10 次中有 9 次运行正常。
但这 1 次 BaseStream.Length 以某种方式设置为 0 - 在调试模式下它显示正常值,始终大于 0 - 这导致我的控制台应用程序出现问题。
我验证了长度不等于 0,因为它是一个只会增长的日志文件。所以我猜这是一个BaseStream问题(可能暂时没有长度值,所以它设置为0)
有没有办法确保 StreamReader.BaseStream.Length
只会 return 正确的值?
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
}
}
您正在读取一个正在被另一个进程写入的文件。 FileShare.ReadWrite 给了你执行此操作的后门。该过程没有义务让您的生活变得轻松。
您正在使用 FileStream.Length,没有任何问题。除了使用 GetFileSize() 向操作系统询问文件大小外,它什么都不做。您总是可以假设某种有缺陷的网络文件系统,但这并不能使您到达任何地方。此处做出的正确假设是您实际上看到了这个过程的作用。
它偶尔会截断文件。发生这种情况时你会得到 0。或者其他一些小数字,它不一定是 0,并且在进程继续写入文件的同时进行调试时当然不必重复。
日志文件没什么特别的,它们不会永远增长。您必须编写代码来适应这一点。很难做到 100% 正确,您不能依赖可靠的长度值。当您获得一个小于前一个值的新值时,您可以做的唯一合理的事情是假设进程开始重写日志文件,因此您将不得不再次开始读取偏移量 0(不是 Length 也不是 lastMaxOffset)。强烈建议使用电话与此应用程序的程序员交谈以验证这些假设。