XmlReader - 如何更新进度条

XmlReader - How to update progress bar

我正在使用 XmlReader 读取非常大的 XML 文件(超过 6GB 的数据)以加速一切并且工作得很好。

我在另一个线程中执行此操作(不使用后台工作程序)并且我不知道如何更新进度条,因为 XmlReader 不有某种 "current position, consumed bytes" 或类似的东西可以帮助我创建关于进度的平均计算。

我尝试使用 XmlReader 和 StreamReader 来计算每一行的字节数,然后根据 消耗的字节数 / 文件长度 * 100 更新进度条,但程序有时会给我一个错误,如

Name cannot begin with the '<' character, hexadecimal value 0x3C. Line 109, position 27.'

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

实现这个的好方法是什么? 我在 google 上搜索并找到了一些实现此目的的方法,但没有使用 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}%)");
            }
        }
    }
}

请注意,这将根据您使用的基础流为您提供不同的输出。在我的系统上,reader 读取 4KB 的块。