数据的保存与读取
人类是在不断探索与改进中进步的
上一篇,邮件群发工具的编写(一)邮件地址提取,我们讲到了邮箱的提取。
那么这一篇,讲一下提取完的邮箱信息的保存和读取。
首先,我希望对上一篇邮箱提取类的功能进行补充,因为上篇文章只讲到一直提取,那万一我中途想中断提取再去做别的事呢又乍办?
因此,必须在对多线程进行人为干预和控制,所以对上篇文章中提到的测试类和方法进行了改进,增加了一个开关逻辑变量Paused,判断这个变量以决定线程是否继续,当然您可能有比这更好的方法,我这里只是抛砖引玉罢了。
1 public class TestClass 2 { 3 public static bool Paused = false; 4 static MailUtil mailUtil = new MailUtil(); 5 static Dictionary<string, LinkMan> linkmans = new Dictionary<string, LinkMan>(); 6 public static Dictionary<string, LinkMan> TestMethod(System.Windows.Forms.ListView listView) 7 { 8 9 System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(delegate 10 { 11 while (mailUtil.HasNext) 12 { 13 14 Dictionary<string, LinkMan> list = mailUtil.Extract(); 15 foreach (KeyValuePair<string, LinkMan> kvp in list) 16 { 17 if (!linkmans.ContainsKey(kvp.Key)) 18 { 19 linkmans.Add(kvp.Key, kvp.Value); 20 System.Windows.Forms.ListViewItem viewItem = listView.Items.Add(linkmans.Count.ToString()); 21 viewItem.SubItems.Add(kvp.Value.Nick); 22 viewItem.SubItems.Add(kvp.Value.Email); 23 viewItem.SubItems.Add(kvp.Value.Area); 24 } 25 } 26 if (Paused) 27 break; 28 } 29 if (linkmans.Count == 0) throw new Exception("没有找到任何数据"); 30 31 })); 32 thread.Start(); 33 return linkmans; 34 } 35 }
接下来是改一下调用的方式,这里面的button是你添加点击的按钮。
1 private void button1_Click(object sender, EventArgs e) 2 { 3 if (this.button1.Text == "开始提取") 4 { 5 this.button1.Text = "中断"; 6 TestClass.Paused = false; 7 links = TestClass.TestMethod(listView1); 8 } 9 else 10 { 11 this.button1.Text = "开始提取"; 12 TestClass.Paused = true; 13 } 14 15 16 }
好了上一篇的提取就到此结束了。
接下来步入正文。保存数据通常我们用数据库,本地数据库有access,当然我们这里不用数据库用到xml技术就可以了。
xml的操作其实很简单,这里为了我们以后调用方便,我还是把xml进行了一个简单的封装处理。
千言万语,还是不如直接上代码直观。
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Xml; 5 using System.Runtime.CompilerServices; 6 /// 7 ///作者:凌晨的搜索者 8 ///网址:www.uu102.com 9 /// 10 namespace System 11 { 12 public class U_Xml 13 { 14 public string FileName { get; set; } 15 public XmlDocument XmlDoc { get; set; } 16 public XmlElement RootElement { get; set; } 17 public U_Xml() 18 { 19 } 20 public U_Xml(string fileName ,string rootElement) 21 { 22 this.FileName = fileName; 23 this.XmlDoc = new XmlDocument();//创建xml文档 24 XmlDeclaration xmlDeclaration = this.XmlDoc.CreateXmlDeclaration("1.0", "utf-8", null); 25 this.XmlDoc.AppendChild(xmlDeclaration);//添加申明 26 this.RootElement =this.XmlDoc.CreateElement(rootElement);//创建根元素 27 this.XmlDoc.AppendChild(this.RootElement); //添加根元素 28 29 } 30 31 public static XmlDocument LoadFromFile(string fileName) 32 { 33 XmlDocument xmlDoc = new XmlDocument(); 34 xmlDoc.Load(fileName);//加载已经存在的文件 35 return xmlDoc; 36 } 37 public void Save(string fileName) 38 { 39 if (!string.IsNullOrEmpty(fileName)) 40 this.FileName = fileName; 41 if (this.XmlDoc == null) throw new Exception("没有创建xml文档,无法保存"); 42 this.XmlDoc.Save(this.FileName); 43 } 44 public void Save() 45 { 46 Save(""); 47 } 48 } 49 /// <summary> 50 /// 这个类,用到扩展方法,用起来相当方便,有点像jquery的链式编程 51 /// </summary> 52 public static class Methods 53 { 54 55 /// <summary> 56 /// 添加节点 57 /// </summary> 58 /// <param name="arr"> 59 /// 第一个参数:xml实例化类 60 /// 第二个参数:节点名字 61 /// <returns></returns> 62 public static XmlNode AddNode(this XmlElement _xmlElement, params object[] arr) 63 { 64 65 U_Xml u_Xml=(U_Xml)arr[0]; 66 XmlNode xmlNode =u_Xml.XmlDoc.CreateNode(XmlNodeType.Element,(string)arr[1],""); 67 _xmlElement .AppendChild(xmlNode);//添加节点 68 return xmlNode; 69 70 } 71 /// <summary> 72 /// 添加节点 73 /// </summary> 74 /// <param name="arr"> 75 /// 第一个参数:xml实例化类\n 76 /// 第二个参数:节点名字 77 /// </param> 78 /// <returns></returns> 79 public static XmlNode AddNode(this XmlNode _xmlElement, params object[] arr) 80 { 81 U_Xml u_Xml = (U_Xml)arr[0]; 82 XmlNode xmlNode = u_Xml.XmlDoc.CreateNode(XmlNodeType.Element, (string)arr[1],""); 83 _xmlElement.AppendChild(xmlNode);//添加节点 84 return xmlNode; 85 } 86 /// <summary> 87 /// 添加属性 88 /// </summary> 89 /// <param name="arr"> 90 /// 第一个参数:xml实例化类\n 91 /// 第二个参数:属性名称\n 92 /// 第三个参数:属性值 93 /// </param> 94 /// <returns></returns> 95 public static XmlAttribute AddAttibute(this XmlElement _xmlElement, params object[] arr) 96 { 97 U_Xml u_Xml = (U_Xml)arr[0]; 98 XmlAttribute xmlAttribute = u_Xml.XmlDoc.CreateAttribute((string)(arr[1])); 99 xmlAttribute.Value = (string)arr[2]; 100 _xmlElement.Attributes.Append(xmlAttribute); 101 return xmlAttribute; 102 } 103 /// <summary> 104 /// 添加属性 105 /// </summary> 106 /// <param name="arr"> 107 /// 第一个参数:xml实例化类\n 108 /// 第二个参数:属性名称\n 109 /// 第三个参数:属性值 110 /// </param> 111 /// <returns></returns> 112 public static XmlAttribute AddAttibute(this XmlNode _xmlElement, params object[] arr) 113 { 114 U_Xml u_Xml = (U_Xml)arr[0]; 115 XmlAttribute xmlAttribute = u_Xml.XmlDoc.CreateAttribute((string)(arr[1])); 116 xmlAttribute.Value = (string)arr[2]; 117 _xmlElement.Attributes.Append(xmlAttribute); 118 return xmlAttribute; 119 } 120 public static XmlNode ReName(this XmlElement _xmlElement, params object[] arr) 121 { 122 string value = (string)arr[2]; 123 124 U_Xml u_Xml=(U_Xml)arr[0]; 125 XmlNode xmlElement = u_Xml.XmlDoc.CreateNode("element",value,""); 126 if (u_Xml.XmlDoc[(string)arr[1]] == null) throw new Exception("不存在该节点"); 127 xmlElement.InnerText = u_Xml.XmlDoc[(string)arr[1]].InnerText; 128 u_Xml.XmlDoc[(string)arr[1]].ParentNode.ReplaceChild(xmlElement,u_Xml.XmlDoc[(string)arr[1]]); 129 u_Xml.Save(); 130 return xmlElement; 131 } 132 public static XmlNode ReName(this XmlNode _xmlElement, params object[] arr) 133 { 134 string value = (string)arr[2]; 135 136 U_Xml u_Xml = (U_Xml)arr[0]; 137 XmlNode xmlElement = u_Xml.XmlDoc.CreateNode("element", value, ""); 138 xmlElement.InnerText = u_Xml.XmlDoc[(string)arr[1]].InnerText; 139 u_Xml.XmlDoc[(string)arr[1]].ParentNode.ReplaceChild(xmlElement, u_Xml.XmlDoc[(string)arr[1]]); 140 u_Xml.Save(); 141 return xmlElement; 142 } 143 public static void Delete(this XmlNode _xmlElement) 144 { 145 if (_xmlElement == null) throw new Exception("该节点不存在"); 146 if(_xmlElement.ParentNode.HasChildNodes) _xmlElement.ParentNode.RemoveChild(_xmlElement); 147 } 148 } 149 150 }
写到这里,可能很多人会开始产生疑问了,几句简单的xml保存操作代码,有必要写成这样吗?答案肯定是有必要咯。至于上面的那个我封装好的保存类,用起来相当简单,大家把代码复制后可以试试效果,简单极了。
调用的话也可以说是超简单的。
1 private void button2_Click(object sender, EventArgs e) 2 { 3 U_Xml u_Xml = new U_Xml(Environment.CurrentDirectory + "\\Config\\MailInfo.xml", "MailSet"); 4 foreach (KeyValuePair<string, LinkMan> kvp in links) 5 { 6 XmlNode xmlNode= u_Xml.RootElement.AddNode(u_Xml, "Email"); 7 xmlNode.AddAttibute(u_Xml, "Nick", kvp.Value.Nick); 8 xmlNode.AddAttibute(u_Xml, "Area", kvp.Value.Area); 9 xmlNode.InnerText = kvp.Value.Email; 10 } 11 u_Xml.Save(); 12 13 }
好了,废话不多说了,千言万语尽在代码中。保存的操作就这样完了。
下一篇,我们会涉及到群发邮件的核心问题。教程每天都在更新,希望大家继续关注!
由于本博客内部原因,文章是后面重新不上去的,请各位谅解