2012-01-03 73 views
1

我尝试创建一个进度条来显示分析器读取文本文件的进度。为什么文件大小(字节)不等于每行的总和字节大小?

为了做到这一点,我读使用fileSize = FileInfo(file).Length并在每次迭代文件的字节,我使用

sum += reader.CurrentEncoding.GetByteCount(currentLine)

总结当前行的字节我认为,当我读完整个文件sum应该等于fileSize

但是,事实并非如此。 sum始终比fileSize低几千字节。为什么是这样?我怎样才能正确创建一个进度,显示已经解析了多少文件?

+1

是缺失的字节等于(或双)的数量在文件中的行数,通过任何机会呢? – 2012-01-03 12:54:44

+1

也许读者.CurrectEncoding.GetByteCount不计算回车/线反馈字符? – Arne 2012-01-03 12:55:17

+1

你在计算换行符的字节数吗? – Rotem 2012-01-03 12:57:29

回答

4

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

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

Hello 
World 

计数每行只是个字节,你最终有10个字节(每5个字符)。但是,根据文件编码的不同,它将具有标记为\r\r\n\n的行结束,该行不包含在行的长度中。

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

8

因为ReadLine()将删除行尾。通常CR + LF,但不幸的是还有其他的约定(只是LF)的文本文件。

我想你可以找到换行是在您的数据什么,只是添加了lenght,没有必要与编码打扰:

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

这是否currentLine在结尾换行字符?如果你这样做

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

这在所有情况下都不起作用,因为'Environment.NewLine'可能包含'\ r \ n'或者简单的'\ n'。但是,这并不意味着文件使用相同的编码(例如,它可能是在Unix系统上创建的)。 – Mario 2012-01-03 12:56:32

0

这是因为在文件系统中每个文件还与元数据,如权限,时间戳等你也没有占特殊字符,如换行,行结束符,文件末尾的标题。不要担心,如果您想要精确处理进度条或FileInfo(如果不是真的话),请使用您的总和线。

+0

元数据不计入文件大小,它被单独存储。你是对的行尾和文件结束。 – 2012-01-03 13:40:44