XmlReader-如何更新进度条

时间:2018-07-16 12:52:01

标签: c# xml progress-bar large-files

我正在使用 XmlReader 读取非常大的XML文件(超过6GB的数据),以加速所有操作,并且效果很好。

我正在另一个线程中执行此操作(不使用Background Worker ),而且我不知道如何更新进度条,因为XmlReader没有某种“当前位置,已消耗的字节数”之类的东西,可以帮助我对进度进行平均计算的人。

我尝试将XmlReader和StreamReader一起使用以计算每一行的字节数,然后根据消耗的字节数/文件长度* 100 更新进度条,但是该程序位于某些地方给我一个错误,例如

  

名称不能以'<'字符(十六进制值0x3C)开头。 109行,位置27。'

使用StreamReader Encoding.UTF8.GetByteCount(ReadLine())时。

有什么好的方法可以做到这一点? 我在Google上进行了搜索,发现了一些方法可以实现此目的,但是如果不使用XmlReader,就不能使用XmlReader。

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以查看基础流的位置:

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的块。