// 将tasks保存到二进制文件中
public Boolean saveToFile(String file)
{
    try
    {
        )
        {
            // 没任务就不存
            return false;
        }

        if (File.Exists(file))
        {
            // 原有文件删掉
            File.Delete(file);
        }

        // 写文件
        FileStream writeStream = new FileStream(file, FileMode.Create);
        BinaryWriter bw = new BinaryWriter(writeStream);

        foreach (Dld tt in tasks)
        {
            bw.Write((String)tt.getID());// 以下强制类型转换并非必要,而是为了阅读时辨别类型
            bw.Write((String)tt.getFilename());
            bw.Write((String)tt.getUrl());
            bw.Write((long)tt.getRemoteFileSize());
            bw.Write((String)tt.getPercent());
            bw.Write((String)tt.getStatus());
            bw.Write((String)tt.getType());
            bw.Flush();
        }

        bw.Close();
        writeStream.Close();

        return true;
    }catch(Exception e){
        throw e;
    }
}

// 从二进制文件中提取tasks
public Boolean loadFromFile(String file)
{
    try
    {
        if (File.Exists(file)==false)
        {
            // 文件不存在直接返回
            return false;
        }

        // 读文件
        FileStream readStream = new FileStream(file, FileMode.Open);
        BinaryReader br = new BinaryReader(readStream);

        try
        {
            while(true)
            {                // 读取过程正好是写入过程的逆序
                String id = br.ReadString();
                String filename = br.ReadString();
                String url = br.ReadString();
                long remoteFileSize = br.ReadInt64();
                String percent = br.ReadString();
                String status = br.ReadString();
                String type = br.ReadString();

                // 这个地方要根据类型判断
                Dld tnew = null;

                if (type.Equals("http"))
                {
                    tnew = new HttpDld(mainGui, id, filename, url, remoteFileSize, type);
                }
                else if (type.Equals("ftp"))
                {
                    tnew = new FtpDld(mainGui, id, filename, url, remoteFileSize, type);
                }

                tnew.setStatus(status);
                tnew.setPercent(percent);

                tasks.Add(tnew);
            };
        }
        catch(EndOfStreamException ex){// 读完会抛出这个异常,正常过程
            System.Console.WriteLine("文件" + file + "读取完毕,读取任务" + tasks.Count+"条.");
        }

        br.Close();
        readStream.Close();

        return true;
    }
    catch (Exception e)
    {
        throw e;
    }
}

C# 将链表存入二进制文件及读取二进制文件得到链表示例的更多相关文章

  1. 信息管理代码分析<二>读取二进制文件数据

    first和end做为全局变量,分别指向链表的头和尾.建立链表的方式也比较简易,从二进制文件数据块中,依次从头到尾读取,每读取一个就建立一个结点. /*基本模型*/ EMP *emp1; while( ...

  2. 用 C# 读取二进制文件

    当想到所有文件都转换为 XML时,确实是一件好事.但是,这并非事实.仍旧还有大量的文件格式不是XML,甚至也不是ASCII.二进制文件仍然在网络中传播,储存在磁盘上,在应用程序之间传递.相比之下,在处 ...

  3. 获取博客积分排名,存入数据库,读取数据进行绘图(python,selenium,matplotlib)

    该脚本的目的:获取博客的排名和积分,将抓取时间,排名,积分存入数据库,然后把最近的积分和排名信息进行绘图,查看积分或者排名的变化情况. 整个脚本的流程:是利用python3来编写,利用selnium获 ...

  4. C语言实现数据机构链表的基本操作(从键盘输入生成链表、读取数组生成链表)

    利用头插法实现逆置 下面简单介绍一下,算法思想结合图示看 算法思想:"删除"头结点与链表其他结点的原有联系(即将头结点的指针置空),再逐个插入逆置链表的表头(即"头插&q ...

  5. c++单链表冒泡排序(交换结点),链表增删改查,运算符重载

    #include <iostream> #include <stdlib.h> #include <time.h> #include <fstream> ...

  6. java使用poi读取ppt文件和poi读取excel、word示例

    java使用poi读取ppt文件和poi读取excel.word示例 http://www.jb51.net/article/48092.htm

  7. 牛客网:将两个单调递增的链表合并为一个单调递增的链表-Python实现-两种方法讲解

    方法一和方法二的执行效率,可以大致的计算时间复杂度加以对比,方法一优于方法二   1. 方法一: 思路: 1. 新创建一个链表节点头,假设这里就叫 head3: 2. 因为另外两个链表都为单调递增,所 ...

  8. LeetCode初级算法--链表02:合并两个有序链表

    LeetCode初级算法--链表02:合并两个有序链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  9. [LC]83题 Remove Duplicates from Sorted List(删除排序链表中的重复元素)(链表)

    ①英文题目 Given a sorted linked list, delete all duplicates such that each element appear only once. Exa ...

随机推荐

  1. TensorFlow——小练习:feed

    feed就是喂入数据 使用feed前必须要有占位符作为操作的对象,在运行操作的时候喂入数据. # _*_coding:utf-8_*_ import tensorflow as tf import n ...

  2. 【Luogu】P2447外星千足虫(高斯消元)

    题目链接 高斯消元解%2意义下的方程,Bitset优化一下. 在消的过程中就能顺便把有解的第一问求出来,记录一下访问过的最大行. #include<cstdio> #include< ...

  3. spring分布式事务控制

    应用场景问题描述解决方法多数据源配置单元测试第一种方法:最大努力一次提交模式第二种方法:最大努力一次提交模式 但使用ChainedTransactionManagerChainedTransactio ...

  4. 最里层的是child元素

    1. 简介A convenience widget that combines common painting, positioning, and sizing widgets. Container在 ...

  5. 微信小程序页面跳转传参

    1.传递参数方法   使用navigatior组件 <navigator url="/pages/pull/pull?title=lalla&name=cc" hov ...

  6. 多态Poly中的向上/下转型 Upcast/Downcast

    [参考资料]马克-to-win java中多态polymorphism,向上转型和动态方法调度有什么用? java中什么叫多态,动态方法调度(dynamic method dispatch)? jav ...

  7. docker 查询或获取私有仓库(registry)中的镜像

    docker 查询或获取私有仓库(registry)中的镜像,使用 docker search 192.168.1.8:5000 命令经测试不好使. 解决: 1.获取仓库类的镜像: [root@sha ...

  8. JavaScript基础深入之----参数传递的分析与总结

    JS的数值类型是分为两类:基本数据类型和引用数据类型. 基本类型占据的内存栈空间,引用类型被保存在堆空间.引用类型赋值的变量也是被保存在栈空间的,它的作用类似于电视遥控器,负责操作堆空间内指向的对象. ...

  9. luogu 3709 大爷的字符串题 构造 莫队 区间众数

    题目链接 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区间中随机拿出一个字符\(x\),然后把\(x\)从这个区间中删除,你要维护一个集合S 如果\(S\)为空,你\(r ...

  10. Linux 之 Vim常用命令

    Vim常用命令 参考教程:[千峰教育] 终端编辑命令工具: vi/vim.emacs等. vim简介: vim是vi的扩展,被誉为终端编辑之神. vim安装: yum install -y vim 工 ...