// 将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. 提交AppStore被拒原因总结

    (1)Information Needed We began the review of your app but aren’t able to continue because we need ad ...

  2. 淘宝的TProfile分析

    TProfile是一个用来抓取性能数据的工具.大概是去年的时候对其分析了一下,并将它改造成了用于分析学习开源产品时的一个trace工具(不是很完善,自己用够用).现在将之前的笔记翻出来,记录一下. 1 ...

  3. linux随笔二

    1.查看整个文件 cat mongo.sh    查看脚本文件的内容:mongo 172.60.0.203:27017/che001 -uplatform -pplatform cat -n **,查 ...

  4. Leetcode 437.路径总和III

    路径总和III 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点). ...

  5. 使用sami生成文档

    从composer安装sami $ composer require sami/sami composer自动配置完以后,可以先测试一下是否安装成功.只要不带参数的运行一下sami,就会知道结果. $ ...

  6. ASP.NET配置设置-关于web.config各节点的讲解

    在msdn中搜索:“ASP.NET配置设置”,可以查看各个节点的配置. httpRuntime 元素:配置 ASP.NET HTTP 运行时设置,以确定如何处理对 ASP.NET 应用程序的请求.

  7. struts拦截器的使用

    拦截器的使用 转自http://blog.csdn.net/woshisap/article/details/7271854 1:拦截器(Interceptor) 拦截器是Struts2最强大的特性之 ...

  8. HDU——2723Electronic Document Security(STL map嵌套set做法)

    Electronic Document Security Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  9. spring的事务传播与隔离

    propagation 事务的传播属性: 1.PROPAGATION_REQUIRED(*-required):支持当前事务,如果当前没有事务,就新建一个事务.(最常见的选择) 2.PROPAGATI ...

  10. bzoj 3779 重组病毒 好题 LCT+dfn序+线段树分类讨论

    题目大意 1.将x到当前根路径上的所有点染成一种新的颜色: 2.将x到当前根路径上的所有点染成一种新的颜色,并且把这个点设为新的根: 3.查询以x为根的子树中所有点权值的平均值. 分析 原题codec ...