[英]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.