C# FileInfo.Length!=所有行长度之和
我正试图为大文件的阅读制作一个进度条。 我将进度条的最大值设置为C# FileInfo.Length!=所有行长度之和,c#,C#,我正试图为大文件的阅读制作一个进度条。 我将进度条的最大值设置为FileInfo.Length,我使用StreamReader.ReadLine读取每一行,并计算每一行长度的总和(使用String.Length)来设置进度条的当前值 我注意到,文件的总长度与每行长度之和之间存在差异。例如: FileInfo.Length=25577646 所有线路长度之和=25510563 为什么会有这样的差异 谢谢你的帮助 您没有添加行尾。它可以是1到4个字节,具体取决于编码,或者是\n或\r或\r\n(1个
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
)
发件人:
行号定义为后跟换行符(“\n”)、回车符(“\r”)或紧接换行符(“\r\n”)的回车符序列
其他问题:如果您的文件是UTF8,那么C#char长度与字节长度不同:è
是C#中的一个字符(使用UTF16),UTF8中的两个字符。你可以:
int len = Encoding.UTF8.GetByteCount(line);
这里有两个问题:
提供每个字符串中的字符数,而string.Length
提供字节数。这些可能是非常不同的事情,这取决于所使用的字符和编码FileInfo.Length
- 不包括换行符(通常是
或\n
),因为在使用\r\n
TextReader.ReadLine
- 您可能知道文件的编码,因此可以通过调用
将每一行转换回字节,以解释这种差异。但这样做是相当浪费的encoding.GetBytes
- 如果您知道文件使用的换行符,您可以为读取的每一行添加相关的字节数
- 您可以保留对底层流的引用,并使用
来检测您实际读取文件的距离。这不一定与您处理的数据量相同,因为stream.Position
将有一个缓冲区。(因此,您可能会“看到”StreamReader
已读取所有数据,即使您尚未处理所有行。)流
最后一个想法可能是最干净的,我想。谢谢!我刚刚在每个String.length中添加了2,结果与
FileInfo.length
完全相同。