跟踪大型 XML 文件的加载进度

2023-11-24

我尝试跟踪 dotnet(C#,框架 3.5 SP1)中大 XML 文件(我不是这些文件的提供者)的加载进度:通过网络文件共享从 1 MB 到 300 MB。

我使用 XmlReader 进行加载,而不是直接使用 XmlDocument.Load 方法来加速加载过程。

顺便说一句,我在互联网/文档上找不到有关如何跟踪此加载进度的信息:似乎不存在代表/事件。有什么方法可以执行此任务吗?拥有用于 XML 保存目的的功能可能是一件好事。

Thanks


假设您正在从流中读取内容,这是一个(不完美的)示例,说明如何执行此操作...... 基本上,ProgressStreamWrapper 会包装文件流,并在 Position 更改时引发一个事件。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Reading big file...");

        FileStream fileStream = File.OpenRead("c:\\temp\\bigfile.xml");
        ProgressStreamWrapper progressStreamWrapper = new ProgressStreamWrapper(fileStream);
        progressStreamWrapper.PositionChanged += (o, ea) => Console.WriteLine((double) progressStreamWrapper.Position / progressStreamWrapper.Length * 100 + "% complete");
        XmlReader xmlReader = XmlReader.Create(progressStreamWrapper);

        while (xmlReader.Read())
        {
            //read the xml document
        }

        Console.WriteLine("DONE");
        Console.ReadLine();
    }
}


public class ProgressStreamWrapper : Stream, IDisposable
{
    public ProgressStreamWrapper(Stream innerStream)
    {
        InnerStream = innerStream;
    }

    public Stream InnerStream { get; private set; }

    public override void Close()
    {
        InnerStream.Close();
    }

    void IDisposable.Dispose()
    {
        base.Dispose();
        InnerStream.Dispose();
    }

    public override void Flush()
    {
        InnerStream.Flush();
    }

    public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
    {
        return InnerStream.BeginRead(buffer, offset, count, callback, state);
    }

    public override int EndRead(IAsyncResult asyncResult)
    {
        int endRead = InnerStream.EndRead(asyncResult);
        OnPositionChanged();
        return endRead;
    }

    public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
    {
        return InnerStream.BeginWrite(buffer, offset, count, callback, state);
    }

    public override void EndWrite(IAsyncResult asyncResult)
    {
        InnerStream.EndWrite(asyncResult);
        OnPositionChanged(); ;
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        long seek = InnerStream.Seek(offset, origin);
        OnPositionChanged();
        return seek;
    }

    public override void SetLength(long value)
    {
        InnerStream.SetLength(value);
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        int read = InnerStream.Read(buffer, offset, count);
        OnPositionChanged();
        return read;
    }

    public override int ReadByte()
    {
        int readByte = InnerStream.ReadByte();
        OnPositionChanged();
        return readByte;
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        InnerStream.Write(buffer, offset, count);
        OnPositionChanged();
    }

    public override void WriteByte(byte value)
    {
        InnerStream.WriteByte(value);
        OnPositionChanged();
    }

    public override bool CanRead
    {
        get { return InnerStream.CanRead; }
    }

    public override bool CanSeek
    {
        get { return InnerStream.CanSeek; }
    }

    public override bool CanTimeout
    {
        get { return InnerStream.CanTimeout; }
    }

    public override bool CanWrite
    {
        get { return InnerStream.CanWrite; }
    }

    public override long Length
    {
        get { return InnerStream.Length; }
    }

    public override long Position
    {
        get { return InnerStream.Position; }
        set
        {
            InnerStream.Position = value;
            OnPositionChanged();
        }
    }

    public event EventHandler PositionChanged;

    protected virtual void OnPositionChanged()
    {
        if (PositionChanged != null)
        {
            PositionChanged(this, EventArgs.Empty);
        }
    }

    public override int ReadTimeout
    {
        get { return InnerStream.ReadTimeout; }
        set { InnerStream.ReadTimeout = value; }
    }

    public override int WriteTimeout
    {
        get { return InnerStream.WriteTimeout; }
        set { InnerStream.WriteTimeout = value; }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跟踪大型 XML 文件的加载进度 的相关文章

  • 计算文本框中换行的行数

    我在文本框中有一行文本 并且换行为多行 如何计算文本框中换行的行数 你可以使用String Split int lineCount txt Text Split new n r StringSplitOptions None Length
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne
  • 为什么匹配模板类上的部分类模板特化与没有模板匹配的另一个部分特化不明确?

    这个问题可能很难用标题中的句子来描述 但这里有一个最小的例子 include

随机推荐

  • 如何删除字符?

    如何删除字符串中的特殊字符和字母 qwert1234 90 this might be my cell value 我必须将其转换为 123490 I mean I have to remove everything but keep on
  • 检测并重新启动崩溃的 .NET 应用程序

    如何检测我的 NET 应用程序已崩溃 然后重新启动它 另一种解决方案 基于这个例子 是创建一个控制应用程序的启动器 class LauncherProgram static int count 3 static void Main Laun
  • QF_FPA? Z3支持IEEE-754算法吗?

    浏览 Z3 源代码 我发现了一堆引用 QF FPA 的文件 它似乎代表无量词 浮点算术 但是 我似乎无法找到有关其状态或如何通过各种前端 特别是 SMT Lib2 使用它的任何文档 这是 IEEE 754 FP 的编码吗 如果是这样 支持哪
  • 一个 Firefox 扩展,可以更改 about:config 中的值

    我一直在网络上广泛搜索一些微小的光 但一无所获 我需要创建一个 Firefox 扩展 除其他外 它还可以更改 about config 变量之一的值 我找到的教程都没有涵盖这个问题 所以我不知道从哪里开始 谁能给我一个链接 几行代码或解释
  • 如何使用 LINQ 从 List 中获取最接近的数字?

    如何从a中获取最接近的数字List
  • 使用适配器通过 MOXy 或任何其他 JAXB 实现将类编组到根元素

    我有一个类 它扩展了 Apache Commons Configuration 中的 CompositeConfiguration 类 我正在尝试使用 MOXy 将其编组为 XML 我创建了一个 XML 适配器 它将配置转换为简单名称 值对
  • 如何使用 php 删除 json 响应中的反斜杠(“\”)?

    我尝试使用 php 将一行 mysql 查询添加到 JSON 中 我使用这段代码 public function lugaresCercanos lng lat distance result mysql query SELECT nomb
  • 在运行时根据语法构建解析器

    许多 大多数 C 正则表达式库允许在运行时从字符串创建表达式 有谁知道任何 C 解析器生成器允许在运行时将表示为字符串的语法 最好是 BNF 输入到生成器中 我发现的所有实现要么需要运行显式代码生成器 要么需要通过巧妙的模板元编程来表达语法
  • 64 位 Windows 中的汇编系统调用

    我使用的是 Windows 10 安装了 Cygwin 我一直使用 Cygwin 来使用 Cygwin 安装的 gcc 和 nasm 来编译 汇编 c 和汇编程序 据我所知 nasm有一个 f win64模式 因此它可以汇编64位程序 现在
  • 标识列与主键[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我们如何决定使用身份列还是主键 这两个概念并不相互排斥 所有组合都是可能的 身份列也是主
  • 为什么此查询在存储过程中返回不同的结果?

    Synopsis 我有一个查询WHERE包含一个条件的子句 该条件根据可能为 NULL 的参数检查可 NULL 列 如下所示 SELECT FROM Table WHERE NullableColumn NullableParameter
  • Python Tkinter 笔记本小部件

    Using 这个蟒蛇食谱 我在我的 Tk 窗口上创建了一个类似笔记本的小部件 一切正常 直到我尝试将图像添加到每个选项卡中 当我将图像添加到选项卡中时 我最初设置的文本不再显示 我想知道是否可以使文本 在本例中为 选项卡一 显示在图像正下方
  • Node.js 网络库:从“data”事件获取完整数据

    我四处寻找 要么找不到我想要回答的确切问题 要么我需要有人像我 5 岁一样向我解释 基本上 我有一个使用 Net 库的 Node js 脚本 我正在连接到多个主机 发送命令 并监听返回数据 var net require net var n
  • 使用 WKWebView 拉动刷新

    我正在尝试将刷新拉动添加到 WKWebView 在这段代码中 我应该在哪里添加一些东西来允许我触发拉动刷新 我还没有找到任何可行的方法将其添加到我的代码中 因此您不会在下面的代码中找到我尝试完成此操作的任何尝试 我找到的大多数答案都是 Ob
  • 添加高斯噪声

    我有一个 arff文件 其中包含浮点数列表 我需要向每个数字添加高斯噪声 在 MATLAB 中为 m m k randn size m where m是列表中的数字之一 并且k是一个标准差并且有值0 1 是什么C 相当于randn 您能举个
  • Hibernate Envers - 不为 createQuery(...).executeUpdate() 写入审核记录,仅为 .persist() 和 .merge() 写入审核记录

    我有 3 种方式将数据写入数据库 public void create T object entityManager persist object public void update T object object entityManag
  • 寻找一个 O(1) 索引和 O(log(n)) 插入和删除的数据容器

    我不确定这是否可能 但对我来说似乎有点合理 我正在寻找一种允许我执行这些操作的数据结构 插入一个项目的时间复杂度为 O log n 删除一个项目的时间复杂度为 O log n 查找 编辑 O 1 中的第 k 个最小元素 对于任意 k O 1
  • 条带连接错误

    我有以下后端 Node js 代码来连接到我的 Stripe 帐户以进行收费 但我收到这个错误 我正在使用 Firebase 函数 并且此功能以前可以工作 因此我怀疑这与 Firebase 访问限制有关 对此的任何想法和帮助将不胜感激 va
  • Firebase 云消息传递 HTTP V1 API:如何通过 REST 调用获取 Auth 2.0 访问令牌?

    为了使用HTTP V1 API 不是旧版 API 对于 PHP 必须使用 REST 接口 https firebase google com docs cloud messaging send message top of page 我想知
  • 跟踪大型 XML 文件的加载进度

    我尝试跟踪 dotnet C 框架 3 5 SP1 中大 XML 文件 我不是这些文件的提供者 的加载进度 通过网络文件共享从 1 MB 到 300 MB 我使用 XmlReader 进行加载 而不是直接使用 XmlDocument Loa