我尝试创建一个进度条,显示解析文本文件的解析器的进度。
为此,我使用fileSize = FileInfo(file).Length
读取文件的字节,并在每次迭代中,我使用
sum += reader.CurrentEncoding.GetByteCount(currentLine)
我认为当我读完整个文件后,sum
应该等于fileSize
。
但是,情况并非如此。 sum
总是比fileSize
低几千字节。为什么是这样?如何正确创建显示我已解析的文件数量的进度?
答案 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。