效果:
需求和分析:
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 } }
待续,,,,,