网络精灵系统

效果:

网络精灵系统_第1张图片

  需求和分析:

 1.点击TreeView中的节点,Listview中显示相应的电视节目,其中节目的信息都储存在xml文件中(IO的应用)

 2.在“所有电台”中选中节点右击可进行添加到“我的电台”,同时在”我的电台“也可进行删除,在你退出后,系统会把你选择的”我的电台“中的记录记录,在你再次打开会显示(IO的     应用或序列化和反系列化的应用)

 3.选中Listview中选中右击可以进行播放

 

1.我们分析好后,我们就得准备我们需要的类和xml文件

  类图:

 

 01.xml文件

    001.存贮频道类型

  <Channel>
    <channelType>TypeA</channelType>
    <!--频道类型-->
    <tvChannel>北京电视台</tvChannel>
    <!--频道名称-->
    <path>files/北京电视台.xml</path>
    <!--频道对应XML文件的本地路径-->
  </Channel>
  <Channel>
    <channelType>TypeB</channelType>
    <tvChannel>凤凰卫视</tvChannel>
    <path>files/凤凰卫视.xml</path>
  </Channel>
</TVChannels>

   002.存储北京电视台(TypeA)

<?xml version="1.0" encoding="utf-8" ?>
<typeA version =" 1.0">
  <channelName>北京电视台</channelName>
  <tvProgramTable>
    <tvProgram>
      <playTime>2009-9-29 06:02</playTime>
      <!--节目播出时间-->
      <meridien>早间档</meridien>
      <!--时段-->

      <programName>重播:国际双行线</programName>
      <!--节目名称-->
      <path>F:\\Day01_01C#基本概念.avi</path>
      <!--视频路径-->
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 07:00</playTime>
      <!--节目播出时间-->
      <meridien>早间档</meridien>
      <!--时段-->

      <programName>北京您早</programName>
      <!--节目名称-->
      <path>C:\New Stories (Highway Blues).wma</path>
      <!--视频路径-->
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 09:02</playTime>
      <!--节目播出时间-->
      <meridien>早间档</meridien>
      <!--时段-->

      <programName>重播《红星剧场》32集剧:勇者无敌(31)</programName>
      <!--节目名称-->
      <path>**</path>
      <!--视频路径-->
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 09:58</playTime>

      <meridien>早间档</meridien>
      <programName>重播《红星剧场》32集剧:勇者无敌(32)</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 11:15</playTime>

      <meridien>午间档</meridien>
      <programName>重播:专题片:我爱你,中国(14)</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 11:58</playTime>

      <meridien>午间档</meridien>
      <programName>身边</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 12:30</playTime>

      <meridien>午间档</meridien>
      <programName>特别关注</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 13:05</playTime>

      <meridien>午间档</meridien>
      <programName>天下天天谈</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 13:40</playTime>

      <meridien>午间档</meridien>
      <programName>《玫瑰剧场》55集剧:闯关东中篇(21)</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 14:32</playTime>

      <meridien>午间档</meridien>
      <programName>《玫瑰剧场》55集剧:闯关东中篇(22)</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 15:27</playTime>

      <meridien>下午档</meridien>
      <programName>《玫瑰剧场》55集剧:闯关东中篇(23)</programName>
      <path>D:\\video\\心灵之约.mp4</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 16:19</playTime>

      <meridien>下午档</meridien>
      <programName>《玫瑰剧场》55集剧:闯关东中篇(24)</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 17:31</playTime>

      <meridien>下午档</meridien>
      <programName>法治进行时</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 18:00</playTime>

      <meridien>晚间档</meridien>
      <programName>新闻晚高峰</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 18:30</playTime>

      <meridien>晚间档</meridien>
      <programName>北京新闻</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 18:56</playTime>

      <meridien>晚间档</meridien>
      <programName>天气预报</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 19:00</playTime>

      <meridien>晚间档</meridien>
      <programName>转播CCTV新闻联播</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 19:31</playTime>

      <meridien>晚间档</meridien>
      <programName>看气象</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 19:40</playTime>

      <meridien>晚间档</meridien>
      <programName>专题片:我爱你,中国(15)</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 20:22</playTime>

      <meridien>晚间档</meridien>
      <programName>《爸妈都是老党员》首播庆典</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 21:21</playTime>

      <meridien>晚间档</meridien>
      <programName>《红星剧场》38集剧:咱爸咱妈六十年(1)</programName>
      <path>**</path>
    </tvProgram>
    <tvProgram>
      <playTime>2009-9-29 23:25</playTime>

      <meridien>晚间档</meridien>
      <programName>重播文艺:花样年华歌舞大赛(5)</programName>
      <path>**</path>
    </tvProgram>
  </tvProgramTable>
</typeA>

   003.存储凤凰电视台(TypeB)

<?xml version="1.0" encoding="utf-8" ?>
<typeB version =" 1.0">
  <ProgramList>
    <Program>
      <playTime>2009-9-29 01:30</playTime>
      <!--播出时间-->
      <name>简单工厂模式</name>
      <!--节目名称-->
      <path>D:\简单工厂模式.wmv</path>
      <!--节目视频的本地路径-->
    </Program>
    <Program>
      <playTime>2009-9-29 02:10</playTime>
      <!--播出时间-->

      <name>非凡人物论成功(713)</name>
      <!--节目名称-->
      <path>**</path>
      <!--节目视频的本地路径-->
    </Program>
    <Program>
      <playTime>2009-9-29 02:15</playTime>
      <!--播出时间-->

      <name>有报天天读(28/09/09) </name>
      <!--节目名称-->
      <path>**</path>
      <!--节目视频的本地路径-->
    </Program>
    <Program>
      <playTime>2009-9-29 02:40</playTime>
      <!--播出时间-->

      <name>娱乐大风暴(682) </name>
      <!--节目名称-->
      <path>**</path>
      <!--节目视频的本地路径-->
    </Program>
    <Program>
      <playTime>2009-9-29 03:15</playTime>
      <!--播出时间-->

      <name>上海新长宁集团特约之2009中华小姐环球大赛-美丽前奏(41) </name>
      <!--节目名称-->
      <path>**</path>
      <!--节目视频的本地路径-->
    </Program>
    <Program>
      <playTime>2009-9-29 03:20</playTime>
      <!--播出时间-->

      <name>完全时尚手册:天桥云裳(632)  </name>
      <!--节目名称-->
      <path>**</path>
      <!--节目视频的本地路径-->
    </Program>
    <Program>
      <playTime>2009-9-29 03:40</playTime>
      <!--播出时间-->

      <name>东风康明斯凤凰冲击播:天力士特约之今日看世界(39)  </name>
      <!--节目名称-->
      <path>**</path>
      <!--节目视频的本地路径-->
    </Program>
    <Program>
      <playTime>2009-9-29 04:25</playTime>
      <!--播出时间-->

      <name>音乐中国风(442)  </name>
      <!--节目名称-->
      <path>**</path>
      <!--节目视频的本地路径-->
    </Program>
    <Program>
      <playTime>2009-9-29 04:35</playTime>
      <!--播出时间-->

      <name>维维健康新概念(193) </name>
      <!--节目名称-->
      <path>**</path>
      <!--节目视频的本地路径-->
    </Program>
    <Program>
      <playTime>2009-9-29 04:40</playTime>
      <!--播出时间-->

      <name>红牛凤凰全球连线(28/09/09) </name>
      <!--节目名称-->
      <path>**</path>
      <!--节目视频的本地路径-->
    </Program>
    <Program>
      <playTime>2009-9-29 05:05</playTime>
      <!--播出时间-->

      <name>红云红河时事开讲(28/09/09)  </name>
      <!--节目名称-->
      <path>**</path>
      <!--节目视频的本地路径-->
    </Program>
    <Program>
      <playTime>2009-9-29 05:30</playTime>
      <!--播出时间-->

      <name>别巡检调查队(34)(R) </name>
      <!--节目名称-->
      <path>**</path>
      <!--节目视频的本地路径-->
    </Program>
  </ProgramList>
</typeB>

 

02.频道父类ChannelBase

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 网络电视精灵
{
    //能被序列化的标志
    [Serializable]

    //频道类(父类)
   public  class ChannelBase
    {
       //频道名称
        public string ChannelName { get; set; }
       //频道路径
        public string  ChannelPath { get; set; }
       //节目列表
        public List<TvProgram> List = new List<TvProgram>();
    
       //解析频道节目信息的虚方法
        public virtual void Fetch(){}
       

    }
}

  03.电视节目类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 网络电视精灵
{
    //电视节目类
  public class TvProgram
    {
      //播出时间
        public DateTime PlayTime { get; set; }
      //时段
        public string Median { get; set; }
      //节目名称
        public string ProgramName { get; set; }
      //节目文件路径
        public string  FilePath { get; set; }
    }
}

04.TypeA频道类(子类)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace 网络电视精灵
{
    //TypeA频道类(子类)
   public  class TypeAChannel:ChannelBase
    {
        //获取频道列表
        public override void Fetch()
        {
            
            XmlDocument doc = new XmlDocument();
            //读取指定xml文档
            doc.Load("北京电视台.xml");
            //读取根节点
            XmlNode root = doc.DocumentElement;
            TvProgram tv = null; 
            foreach (XmlNode item in root["tvProgramTable"].ChildNodes)
            {
                //把读取的值赋给变量
                string platytime = item["playTime"].InnerText;
                string path = item["path"].InnerText;
                string progranname = item["programName"].InnerText;
                string meridien = item["meridien"].InnerText;
                //同时把值赋给TvProgram类中的变量
                tv=new TvProgram();
                tv.FilePath = path;
                tv.PlayTime = Convert.ToDateTime(platytime);
                tv.ProgramName = progranname;
                tv.Median = meridien;
                //最后添加到集合
                this.List.Add(tv);
            }
        }
    }
}

   03.TypeB频道类(子类)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace 网络电视精灵
{
    //TpyeB频道类(子类)
  public class TypeBChannel:ChannelBase
    {

        public override void Fetch()
        {

            XmlDocument doc = new XmlDocument();
            //读取指定xml文档
            doc.Load("凤凰电视台.xml");
            //读取根节点
            XmlNode root = doc.DocumentElement;
            TvProgram tv = null;
            foreach (XmlNode item in root["ProgramList"].ChildNodes)
            {
                string platytime = item["playTime"].InnerText;
                string path = item["path"].InnerText;
                string progranname = item["name"].InnerText;
                //string meridien = item["meridien"].InnerText;

                tv = new TvProgram();
                tv.FilePath = path;
                tv.PlayTime = Convert.ToDateTime(platytime);
                tv.ProgramName = progranname;
             
                this.List.Add(tv);
            }
        }
    }
}

  04.创建一个类来解析xml文件(读取的一些操作都在此)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.IO;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
namespace 网络电视精灵
{
    //创建一个类来解析总的电视台
   public  class ChannelManager
    {
       //定义一个泛型集合,所有电台
       public List<ChannelBase> FullChannels;
       //定义一个集合,存取“我的电台”的集合
       public List<ChannelBase> mylist = new List<ChannelBase>();


       //定义一个集合,为了读取以前用户已添加的节目
      public List<ChannelBase> mylove = new List<ChannelBase>();

       public ChannelManager() 
       {
           //实例化泛型,具有重大意义
           FullChannels = new List<ChannelBase>();
       }

       //解析所有的电视台名称
       public void ReadXmlToList() 
       {
           //01.获取地址
           XmlDocument doc = new XmlDocument();
           //读取指定的Xml文件
           doc.Load("FullChannels.xml");
           //02.然后读取xml的根节点
           XmlNode engineer=doc.DocumentElement;
           foreach (XmlNode item in engineer.ChildNodes)
           {
              //获取是什么频道类型
               string pin = item["channelType"].InnerText;
               ChannelBase Channel = ChannelFactory.CreateChannel(pin);

               Channel.ChannelName = item["tvChannel"].InnerText;
               Channel.ChannelPath = item["path"].InnerText;
               FullChannels.Add(Channel);

           }
           
       }


       //用于读写“我的电台”的信息
       //方法一:序列化与反序列化
        #region 序列化
       public void Writer() 
       {
           //二进制序列化器,就是一个类
           BinaryFormatter bf = new BinaryFormatter();
           //以后传递流,就是指向硬盘路径的一个文件流
           FileStream fs = new FileStream("D:\\1.bin", FileMode.Create);
           bf.Serialize(fs, mylist);
           fs.Close();
           MessageBox.Show("序列化成功!");
          
       }
        #endregion

        #region 反序列化
       public void Read()
       {
           //01.反序列化硬盘上的哪个文件
           FileStream fs = new FileStream("D:\\1.bin", FileMode.Open);
           BinaryFormatter bf = new BinaryFormatter();
           mylist = (List<ChannelBase>)bf.Deserialize(fs);

            fs.Close();
           
       }
        #endregion


       //方法二:用IO的写与读
        #region 读与写
       //保存定制频道信息的文本文件名称
       private string saveFileName = @"save";

       //将定制频道信息存入文本文件
       public void SaveAsTxt()
       {
           try
           {
               //创建文件流
               FileStream fs = new FileStream(saveFileName + ".txt", FileMode.Create);
               //创建写入器
               StreamWriter writer = new StreamWriter(fs, Encoding.GetEncoding("gb2312"));

               string type = "";
               //循环定制频道列表
               for (int i = 0; i < mylist.Count; i++)
               {
                   ChannelBase channel = mylist[i];
                   if (channel is TypeBChannel)
                   {
                       type = "TypeB";
                   }
                   else
                   {
                       type = "TypeA";
                   }
                   writer.WriteLine(type + "|" + channel.ChannelName + "|" + channel.ChannelPath);
                  
               }

              // writer.WriteLine("读入成功");
               writer.Close();
               fs.Close();
           }
           catch (Exception)
           {
              // MessageBox.Show("写入失败");

           }
       }

       //读取定制频道信息
       public void ReadAsTxt()
       {
           try
           {
               //创建文件流
               FileStream fs = new FileStream(saveFileName + ".txt", FileMode.Open);
               //创建读取器
               StreamReader reader = new StreamReader(fs, Encoding.GetEncoding("gb2312"));
               string result="";

               while ((result=reader.ReadLine())!=null)
               {
                   //string[] result2 = new string[] { result};
                   string[] num = result.Split('|');

                   //获得是什么频道类型
                   string type = num[0];
                   ChannelBase channel = ChannelFactory.CreateChannel(type);
                   channel.ChannelName = num[1];
                   channel.ChannelPath = num[2];

                   mylist.Add(channel);

               }
                            
               //关闭读取器
               reader.Close();
               fs.Close();

           }
           catch (Exception)
           {
             //  MessageBox.Show("读取失败");

           }
       }
        #endregion
 
    }
}

 待续,,,,,

你可能感兴趣的:(网络精灵系统)