数据的保存与读取

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

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

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

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

因此,必须在对多线程进行人为干预和控制,所以对上篇文章中提到的测试类和方法进行了改进,增加了一个开关逻辑变量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         }

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

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

转载于:https://www.cnblogs.com/uu102/archive/2012/09/02/2667804.html

邮件群发工具的编写(二)数据的保存相关推荐

  1. 邮件群发工具的编写(四)邮件跟踪服务

    不管黑猫白猫,抓得到老鼠的就是好猫 上一篇,邮件群发工具的编写(三)邮件发送的几种方式 中,我们谈到了发送邮件.这一篇,我们讲讲邮件跟踪服务器的创建 邮件群发出去之后,很多朋友都想知道群发的效果.这就 ...

  2. 腾讯微博qq说说备份导出工具_微信重要数据怎么保存?微信聊天记录备份可以吗?...

    说起来,一些重要的数据我们通常会选择怎样保存呢?很多人都不是太了解数据存储的时间,能有五年就不错了.事实上,我们的一些数据可以保存的比我们想象的还要久一些.长期存储对于我们每个人而言,都是生活中十分喜 ...

  3. html邮件模板编辑器_免费电子邮件群发工具推荐「aweber」

    推荐一款免费30天使用的电子邮件群发工具「aweber」,并且它不单单只是一个邮件群发工具,它有非常多的实用功能,以下我会做一些简单介绍. 一:自动化营销渠道 使用aweber的拖放广告系列编辑器构建 ...

  4. qq邮件引流需要注意什么?QQ邮件群发推广的技巧

    目前国内的电子邮箱,由于QQ邮箱和QQ客户端有关联,所以使用QQ邮箱的客户非常多,特别是QQ客户端收到邮件会弹窗提示.QQ邮箱用户已然成为了企业营销人员最受欢迎的目标群体,通过QQ邮件群发推广来推广自 ...

  5. 中国邮件群发服务商现状分析

    在互联网商务的风靡盛世中,EDM邮件营销成为网络营销服务的重要角色.尽管国内并不缺乏规范的专业Email营销服务机构,但让百家知晓的仍寥寥无几.是技术不到位,满足不了企业需求,还是服务商品牌意识太薄弱 ...

  6. 邮件群发平台_海外疫情持续严重影响外贸市场,U-Mail邮件群发应对出招

    2020年将成为一个具有历史性的一年,新冠状病毒疫情在全球持续肆虐,直至3月23号,国内的确诊病例持续下降,国外的疫情缺持续爆发,确诊案例却不断上升.其中以欧美地区和美国为首.阿里巴巴外贸圈名人堂讲师 ...

  7. 邮件群发的5个条件和因素(新手必看)

    一.IP 1.申请IP,指你本机的电脑IP 2.SMTP服务器:指邮件服务器的IP,好的smtp服务器一定符合以下条件: 2.1.静态IP 2.2.没进入国际垃圾邮件IP黑名单 2.3.能泛解析域名 ...

  8. 邮件轻松发--邮件群发小工具

    关于这个工具的创作:相信大家都有找工作的经历,在简历投递的时候是否有这样的烦恼?点对点的发送邮件时,不停的复制粘贴自己的简历发送,在这一期间不仅浪费了大家相当多的一部分时间,而且发送简历的效率也不是很 ...

  9. 用Python编写小工具下载OSM路网数据

    文章来源于Python大数据分析,作者费弗里 本文对应脚本已上传至Github仓库: https://github.com/CNFeffery/DataScienceStudyNotes[1] 1 简 ...

最新文章

  1. (转)金额转中文大写
  2. 深度学习框架大PK:TNN决战MNN,ncnn依旧经典
  3. XX(北京)科技股份公司为啥需要购置服务器?
  4. 带有示例的Python File readlines()方法
  5. Javascript获取地址参数
  6. 甘肃银行借助HDIM打造综合数据保护平台
  7. hp7610扫描到计算机无法激活,惠普HP Officejet 7610一体机解决扫描问题(一)
  8. 5种解决方案可帮助5G商业化并降低网络成本
  9. 云盘服务器被毁,360云盘宣布停止个人云盘服务 明年2月1日清空
  10. “2021云管和云网大会”在京召开
  11. matlab 关键路径函数,用线性规划建模(确定参数)关键路径法
  12. c 语言打印26个大写字母怎么读,26个大写字母读法
  13. 国内首款众筹刷单破亿的产品诞生,监管缺乏下京东刷单文化盛行
  14. python批量图片文字识别_利用Python批量进行图片文字识别
  15. dfs根目录_分布式文件系统DFS详细解读
  16. 燕山大学校园网自动登录问题解决方案
  17. 什么是SQL触发器?SQL触发器是什么意思?
  18. 基于STM32F103RB的模拟液位检测告警系统(已实现)
  19. 使用source导入MySQL出现“ERROR: Failed to open file xx, error: 2“问题的解决
  20. 零基础学python编程思维(九) | 面向对象的编程——类

热门文章

  1. java 多线程异常_java多线程执行异常
  2. python打开setting_Django自带日志 settings.py文件配置方法
  3. 洛谷 P 4180 次小生成树
  4. 一步一步带你训练自己的SSD检测算法
  5. 训练神经网络适合使用交叉熵(cross_entropy)错误率,而不是分类错误率或是均方差
  6. 五分钟了解操作系统内核
  7. 帮人取款每百元抽10元回扣,最终涉嫌诈骗罪被批捕
  8. 这些贷款合同陷阱你知道多少?
  9. C++中public,protected,private派生类继承问题和访问权限问题
  10. python控制流代码怎么用_Python学习笔记控制流的元素