郵件群發工具的編寫(二)數據的保存

?數據的保存與讀取

人類是在不斷探索與改進中進步的

上一篇,郵件群發工具的編寫(一)郵件地址提取,我們講到了郵箱的提取。

那么這一篇,講一下提取完的郵箱信息的保存和讀取。

首先,我希望對上一篇郵箱提取類的功能進行補充,因為上篇文章只講到一直提取,那萬一我中途想中斷提取再去做別的事呢又乍辦?

因此,必須在對多線程進行人為干預和控制,所以對上篇文章中提到的測試類和方法進行了改進,增加了一個開關邏輯變量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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260457.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql 文件描述符_MySQL沒有發布臨時文件描述符

幾天前,我們遇到了MySQL安裝的一些嚴重問題&#xff1a;MySQL不斷打開臨時文件(正常行為)但這些文件從未發布過.結果是,最終磁盤空間耗盡,我們必須重新啟動服務并手動清理/ tmp.使用lsof,我們看到這樣的事情&#xff1a;mysqld 16866 mysql 5u REG 8,3 0 692 /tmp/ibyWJylQ (de…

c++ lambda函數_C++11 之 lambda函數的詳細使用

1. lambda 函數概述lambda 表達式是一種匿名函數&#xff0c;即沒有函數名的函數&#xff1b;該匿名函數是由數學中的λ演算而來的。通常情況下&#xff0c;lambda函數的語法定義為&#xff1a;[capture] (parameters) mutable ->return-type {statement}其中&#xff1a;[c…

zabbix監控 openstack 的實例的資源使用情況

領導提出的需求&#xff1a;在不給云主機安裝客戶端的情況下&#xff0c;監控云主機的 cpui 內存 網絡 io&#xff0c;并且能出圖。想了幾個方案&#xff1a;1、ceilometer取數據&#xff0c;存入mangodb&#xff0c;用zabbix來讀mangodb數據繪圖2 ceilometer 取數據 &#xff…

pytorch 正向與反向傳播的過程 獲取模型的梯度(gradient),并繪制梯度的直方圖

記錄一下怎樣pytorch框架下怎樣獲得模型的梯度 文章目錄引入所需要的庫一個簡單的函數模型梯度獲取先定義一個model如下定義兩個獲取梯度的函數定義一些過程與調用上述函數的方法可視化一下梯度的histogram引入所需要的庫 import os import torch import torch.nn as nn impor…

2012-9

響應式設計的典范 http://www.bostonglobe.com/ 網站測試頁面 http://www.webpagetest.org/ 編程算法 http://blog.sina.com.cn/s/articlelist_1647038822_1_1.html C Programmers Cookbook http://www.cppblog.com/mzty/category/7609.html Blade 是一個現代構建系統&#xff…

PV操作 (轉載)

PV操作與信號量的處理相關&#xff0c;P表示通過的意思&#xff0c;V表示釋放的意思。信號量是最早出現的用來解決進程同步與互斥問題的機制&#xff0c;包括一個稱為信號量的變量及對它進行的兩個原語操作。 信號量&#xff08;semaphore&#xff09;的數據結構為一個值和一個…

ubuntu升級python_Ubuntu 升級python3為更高版本【已實測】

2020-04-13 更新安裝步驟&#xff1a; 1. 先update一下 sudo apt update 2. 安裝依賴庫 sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev liblzma-d…

mysql5.0 java連接_Java連接mysql5.0

網上的資料真爛&#xff0c;千篇一律的拷貝的&#xff0c;根本不能用&#xff0c;鄙視&#xff01; 正題&#xff1a; 到MYSQL網站下載mysql-connector-java-5.0.4.zip文件&#xff0c;解壓&#xff1b; 解壓后有一個文件&#xff1a;mysql-connector-java-5.0.4-bin.jar 把這個…

Framework打包

2019獨角獸企業重金招聘Python工程師標準>>> iOS app需要在許多不同的CPU架構下運行&#xff1a; arm7: 在最老的支持iOS7的設備上使用 arm7s: 在iPhone5和5C上使用 arm64: 運行于iPhone5S的64位 ARM 處理器 上 i386: 32位模擬器上使用 x86_64: 64為模擬器上使用…

windows 10 下利用WSL的Linux環境實現vscode C/C++環境的配置

本文主要結合二個工具&#xff0c;介紹如何在windows搭建Linux開發環境&#xff1a; WSL(Windows Subsystem for Linux)VSCode(Visual Studio Code) 文章目錄WSL安裝VSCode安裝配置Linux下的C/C環境1. 打開WSL的控制臺2. 更新ubuntu軟件3. 安裝GCC和GDB4. 配置VSCode(1). 打開…

java類初始化順序

轉自&#xff1a;http://zangweiren.iteye.com/blog/208122 對于靜態變量、靜態初始化塊、變量、初始化塊、構造器&#xff0c;它們的初始化順序以此是&#xff08;靜態變量、靜態初始化塊&#xff09;>&#xff08;變量、初始化塊&#xff09;>構造器。我們也可以通過下…

Java 8 - Interface Default Method接口默認方法

Java 8 相比于Java 7 推出了幾大特色&#xff08;features&#xff09;(接口默認方法)default methods in interface, &#xff08;接口靜態方法&#xff09;static method in interface, 函數編程(functional programming)&#xff0c; lamda expression, stream API.這里首先…

Windows 11下 WSL使用 jupyter notebook

這里寫目錄標題前言在WSL下的配置測試運行更優雅的啟動方法配置jupyter生成默認配置文件生成秘鑰修改配置文件nohup啟動前言 一直都使用jupyter notebook&#xff0c;不管做數據分析&#xff0c;還是調試代碼&#xff0c;還有寫文章都是。但是好像在WSL下又不好使。看了網上有…

sql2000導出mysql_如何將sql2000的數據庫導入到mysql中?

展開全部先用SQl2000導出e68a843231313335323631343130323136353331333262373366文本文件&#xff0c;把后綴名改為CSv&#xff0c;再從Mysql中一導入OK參考&#xff1a;第一種是安裝mysql ODBC&#xff0c;利用sql server的導出功能&#xff0c;選擇mysql數據源&#xff0c;進…

實現日、周、月排行統計 sql

在如今很多系統中&#xff0c;都需要進行日、周、月排行統計&#xff0c;但是在網上尋找 了一番&#xff0c;發現很多都是相對的周、月排行&#xff0c;即周排行則用當前時間減去7天。這樣我個人認為并不恰當。如月排行中&#xff0c;假設今天是4月22日,則從3月22日至4月22日之…

產品運行所需的信息檢索失敗_為服務業注入新活力,華北工控推出服務機器人專用計算機產品方案...

近年來&#xff0c;隨著人口老齡化趨勢加快和信息科技革命的持續推進&#xff0c;服務機器人已經被當作社會勞動力的一部分在醫療、教育、餐飲等行業廣泛應用&#xff0c;市場潛力巨大。01、需求帶動消費&#xff0c;科技改變服務服務機器人是國內智能機器人產業發展最快的分支…

Windows更新沒有更新提示:從windows 10升級到Windows 11,并WSL下配置cuda

文章目錄從windows 10 升級到Windows 11安裝WSL的安裝配置cuda從windows 10 升級到Windows 11 升級的方法有很多種&#xff0c;各大網站都有。有更新提示的按更新提示操作即可。我的是一直都沒有更新提示&#xff0c;也搜索過網上的一些方法&#xff0c;但都不行。還是沒法更新…

js修改css樣式屬性_這個筆記《CSS樣式的常見屬性及值》,讓菜鳥輕松學會包粽子...

常見樣式屬性及值字體:font-family-size-style: normal(正常)|italic(傾斜)|oblique-weight: normal|bold(粗體)如果組合起來編寫: font: style weight size family字體大小的單位可以是 px, em, rem, pt, cm, mm, in, pc文本:colortext-align(水平對齊方式): left|center|righ…

7.java.lang.IllegalAccessException

java.lang.IllegalAccessException 沒有訪問權限 當應用程序要調用一個類&#xff0c;但當前的方法即沒有對該類的訪問權限便會出現這個異常。對程序中用了Package的情況下要注意這個異常

在 VirtualBox 中 CentOS 網絡設置

轉自&#xff1a;本文發表于水景一頁。永久鏈接&#xff1a;<http://cnzhx.net/blog/minimal-centos-in-virtualbox/>。轉載請保留此信息及相應鏈接。 4. 設置 按照上面的方法安裝之后&#xff0c;還需要一些簡單的設置&#xff0c;比如網絡訪問。然后既然是做網頁服務器…