Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FileInfo.Length!=所有行长度之和_C# - Fatal编程技术网

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
完全相同。