繁体   English   中英

FileInfo.Length!=所有行长度的总和

[英]FileInfo.Length != sum of all line length

我正在尝试为大文件阅读制作进度条。 我将进度条的最大值设置为FileInfo.Length ,我使用StreamReader.ReadLine读取每一行并计算每个行长度的总和(使用String.Length )来设置进度条的当前值。

我注意到文件的总长度和每行的长度之和存在差异。 例如: FileInfo.Length = 25577646所有行长度的总和= 25510563

为什么会有这样的差异?

谢谢你的帮助 !

您没有添加行尾。 它可以是从1到4个字节,这取决于编码,或者如果它是一个\\n\\r\\r\\n (1个字节= UTF8 + \\n ,4个字节= UTF16 + \\r\\n

请注意,使用ReadLine ,无法检查哪个行尾( \\n\\r\\r\\n遇到它)

来自ReadLine

一行被定义为一个字符序列,后跟一个换行符(“\\ n”),一个回车符(“\\ r”),或一个回车符后面紧跟一个换行符(“\\ r \\ n”)

其他问题:如果你的文件是UTF8,那么C#char长度与字节长度不同: è是C#中的一个char(使用UTF16),UTF8中有2个字符。 你可以:

int len = Encoding.UTF8.GetByteCount(line);

这里有两个问题:

  • string.Length为您提供每个字符串中的字符数,而FileInfo.Length为您提供字节数 这些可能是非常不同的东西,取决于使用的字符和编码
  • 您没有包含换行符(通常为\\n\\r\\n ),因为在使用TextReader.ReadLine读取行时会删除换行符

关于如何做到这一点......

  • 您可能知道文件的编码,因此您可以通过调用Encoding.GetBytes将每行重新转换为字节来解释该差异。 尽管这样做会非常浪费。
  • 如果您知道文件使用的换行符,则可以为您读取的每一行添加相关的字节数
  • 您可以保留对基础流的引用,并使用Stream.Position来检测您实际读取的文件的距离。 这不一定与您处理的数据量相同,因为StreamReader将具有缓冲区。 (因此,即使您尚未处理所有行,您也可以“看到” Stream已读取所有数据。)

最后一个想法可能是最干净的IMO。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM