[c#] 邮件群发工具的编写(二)数据的保存

 数据的保存与读取

人类是在不断探索与改进中进步的

上一篇,邮件群发工具的编写(一)邮件地址提取,我们讲到了邮箱的提取。

那么这一篇,讲一下提取完的邮箱信息的保存和读取。

首先,我希望对上一篇邮箱提取类的功能进行补充,因为上篇文章只讲到一直提取,那万一我中途想中断提取再去做别的事呢又乍办?

因此,必须在对多线程进行人为干预和控制,所以对上篇文章中提到的测试类和方法进行了改进,增加了一个开关逻辑变量Paused,判断这个变量以决定线程是否继续,当然您可能有比这更好的方法,我这里只是抛砖引玉罢了。

View Code
 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是你添加点击的按钮。

 

View Code
 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进行了一个简单的封装处理。

千言万语,还是不如直接上代码直观。

View Code
  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保存操作代码,有必要写成这样吗?答案肯定是有必要咯。至于上面的那个我封装好的保存类,用起来相当简单,大家把代码复制后可以试试效果,简单极了。

调用的话也可以说是超简单的。

 

View Code
 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         }

 

好了,废话不多说了,千言万语尽在代码中。保存的操作就这样完了。
下一篇,我们会涉及到群发邮件的核心问题。教程每天都在更新,希望大家继续关注!

由于本博客内部原因,文章是后面重新不上去的,请各位谅解

posted on 2012-09-02 19:17  凌晨的搜索者  阅读(892)  评论(0编辑  收藏  举报

导航