• [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         }

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

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

  • 相关阅读:
    Istio技术与实践02:源码解析之Istio on Kubernetes 统一服务发现
    Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制
    深度剖析Kubernetes API Server三部曲
    深度剖析Kubernetes API Server三部曲
    深度剖析Kubernetes API Server三部曲
    深入了解Kubernetes REST API的工作方式
    Cassandra schema version 不一致
    ByteToMessageDecoder
    Byte Bit
    为什么要用Executors.defaultThreadFactory().newThread(run);创建线程?
  • 原文地址:https://www.cnblogs.com/uu102/p/2667804.html
Copyright © 2020-2023  润新知