为什么文件大小(以字节为单位)不等于每行的总和字节大小?

时间:2012-01-03 12:50:54

标签: c# parsing text progress-bar

我尝试创建一个进度条,显示解析文本文件的解析器的进度。

为此,我使用fileSize = FileInfo(file).Length读取文件的字节,并在每次迭代中,我使用

总结当前行的字节数

sum += reader.CurrentEncoding.GetByteCount(currentLine)

我认为当我读完整个文件后,sum应该等于fileSize

但是,情况并非如此。 sum总是比fileSize低几千字节。为什么是这样?如何正确创建显示我已解析的文件数量的进度?

4 个答案:

答案 0 :(得分:8)

因为ReadLine()会删除行结尾。通常是CR + LF但遗憾的是文本文件还有其他约定(只是LF)。

我想您可以找出LineFeed在您的数据中的含义,只需添加长度,无需费心编码:

sum += reader.CurrentEncoding.GetByteCount(currentLine) + 2;

答案 1 :(得分:4)

可能有几个原因,很可能是由于编码。我不是在谈论像UTF-8编码或类似的编码,而是在线结尾。

例如,文本文件可能包含两行,包含两个单词:

Hello
World

只计算每行的字节数,最终得到10个字节(每个5个字符)。但是,根据文件编码,它的行结尾标有\r\r\n\n,不包含在行的长度中。

根据您的文件大小,您可以将整个文件读入String[],或者将流的当前位置用作进度指示器。

答案 2 :(得分:3)

currentLine最后是否包含换行符?怎么办

sum += reader.CurrentEncoding.GetByteCount(currentLine + Environment.NewLine);

答案 3 :(得分:0)

这是因为文件系统中的每个文件都有一个带有元数据的标题,例如权限,时间戳等。此外,您还没有考虑特殊字符,例如换行符,行结尾,文件结尾。不要担心,如果你想要精确地使用你的进度条,你可以使用你的行总数,如果不是真的,可以使用FileInfo。