我正在使用 XmlReader 读取非常大的 XML 文件(超过 6GB 的数据)以加快一切速度并且工作得非常好。
我在另一个线程中执行此操作(不使用后台工作程序)并且我不知道如何更新进度条,因为 XmlReader 没有某种“当前位置,消耗的字节”或类似的东西,谁可以帮助我创建一个关于进度的平均计算。
我尝试使用 XmlReader 和 StreamReader 来计算每一行的字节数,然后根据消耗的字节数/文件长度 * 100 更新进度条,但是程序在有些时候给我一个错误,比如
Name cannot begin with the '<' character, hexadecimal value 0x3C. Line 109, position 27.'
当使用 StreamReader Encoding.UTF8.GetByteCount(ReadLine())
时。
实现这个的好方法是什么?我在谷歌上搜索并找到了一些实现此目的的方法,但没有使用 XmlReader,而且我不能不使用 XmlReader。
谢谢!
您可以查看底层流的位置:
using (var fileStream = File.OpenRead("somePath"))
{
using (var reader = XmlReader.Create(fileStream))
{
long lastPosition = 0;
while (reader.Read())
{
if (lastPosition != fileStream.Position)
{
lastPosition = fileStream.Position;
Console.WriteLine($"Read {lastPosition} from {fileStream.Length} ({100.0 * lastPosition / fileStream.Length}%)");
}
}
}
}
请注意,这将根据您使用的基础流为您提供不同的输出。在我的系统上,读取器读取 4KB 的 block 。
我是一名优秀的程序员,十分优秀!