?數據的保存與讀取
人類是在不斷探索與改進中進步的
上一篇,郵件群發工具的編寫(一)郵件地址提取,我們講到了郵箱的提取。
那么這一篇,講一下提取完的郵箱信息的保存和讀取。
首先,我希望對上一篇郵箱提取類的功能進行補充,因為上篇文章只講到一直提取,那萬一我中途想中斷提取再去做別的事呢又乍辦?
因此,必須在對多線程進行人為干預和控制,所以對上篇文章中提到的測試類和方法進行了改進,增加了一個開關邏輯變量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 }
?
好了,廢話不多說了,千言萬語盡在代碼中。保存的操作就這樣完了。
下一篇,我們會涉及到群發郵件的核心問題。教程每天都在更新,希望大家繼續關注!
由于本博客內部原因,文章是后面重新不上去的,請各位諒解