【问题标题】:XmlReader - How to update progress barXmlReader - 如何更新进度条
【发布时间】:2018-07-16 12:52:01
【问题描述】:

我正在使用 XmlReader 读取非常大的 XML 文件(超过 6GB 的数据)以加快一切速度并且运行良好。

我正在另一个线程中执行此操作(不使用后台工作人员),我无法弄清楚如何更新进度条,因为 XmlReader 没有某种“当前位置,消耗的字节数”或类似的东西谁可以帮助我创建有关进度的平均计算。

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

名称不能以“

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

什么是实现这一目标的好方法? 我在google上搜索,找到了一些方法来实现这一点,但是没有使用XmlReader,我不能不使用XmlReader。

谢谢!

【问题讨论】:

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


    【解决方案1】:

    您可以查看底层流的位置:

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

    【讨论】:

    • @MutuA。它将以块为单位读取,根据您的系统而有所不同,我的是 4096。这将是您的分辨率。因此,它不会因每个节点读取而增加,而是每读取 8kB 都会增加。往前看你的循环,你会看到它增加了,你可能只看前几个节点,它们都在前 8kB 内
    • @Magnetron 谢谢,现在很清楚了。是的,我只用几个节点对其进行了测试......
    猜你喜欢
    • 2012-03-06
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2020-11-05
    • 2016-07-30
    • 2016-11-22
    • 2014-04-09
    相关资源
    最近更新 更多