实例介绍
【实例简介】
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.Text; using System.IO; namespace QQMhtToHtml { class Program { public static string strHtmlHead = @"<html xmlns=""http://www.w3.org/1999/xhtml""><head><meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8"" /><title>QQ Message</title><style type=""text/css"">body{font-size:12px; line-height:22px; margin:2px;}td{font-size:12px; line-height:22px;}</style></head><body><table width=100% cellspacing=0>"; public static string strHtmlEnd = @"</table></body></html>"; public static bool blGetHtml = false; //生成HTML的正文,第二步进行 public static bool blGetImg = false; //生成消息附件中的图片,第一步进行 public static Dictionary<string, string> dicImg = new Dictionary<string, string>(); //保存图片ID和后缀的对应关系 static void Main(string[] args) { if (args.Length == 0) { ShowHelpMsg(); } else if (args.Length == 2) { if (args[1].ToLower() == "gethtml") blGetHtml = true; if (args[1].ToLower() == "getimg") blGetImg = true; if (blGetHtml || blGetImg) { string strFilePath = args[0]; if (File.Exists(strFilePath)) { DoConvert(strFilePath); } else { Console.WriteLine("文件 " strFilePath " 不存在,按任意键退出"); Console.ReadKey(); } } else { if (!blGetHtml && !blGetImg) Console.WriteLine("参数填写错误,按任意键退出..."); Console.ReadKey(); } } else { if (!blGetHtml && !blGetImg) Console.WriteLine("参数数量错误,按任意键退出..."); Console.ReadKey(); } } //显示帮助信息 public static void ShowHelpMsg() { StringBuilder sb = new StringBuilder(); sb.AppendLine("使用说明:"); sb.AppendLine("该工具用于将较大的MHT格式的QQ记录转换成HTML文本内容和对应的图片附件,解决记录较大时无法打开的问题"); sb.AppendLine("将该工具与聊天记录放在同一级目录,并进入命令行调用,调用步骤如下:"); sb.AppendLine("第1步:"); sb.AppendLine("\t" "QQMhtToHtml.exe <QQ记录.mht> getimg"); sb.AppendLine("\t" "会在img目录下生成图片文件,以及图片字典文件"); sb.AppendLine("第2步:"); sb.AppendLine("\t" "QQMhtToHtml.exe <QQ记录.mht> gethtml"); sb.AppendLine("\t" "会生成html格式的消息记录正文,每5万条记录一个文件"); sb.AppendLine("注意:如果不按照顺序执行,会因没有字典文件导致生成的HTML消息图片不显示"); sb.AppendLine("按任意键退出..."); Console.WriteLine(sb.ToString()); Console.ReadKey(); } //进行MHT转HTML的消息记录转化 public static void DoConvert(string strSrcFilePath) { string strLine; string strSuffix = ""; string strContent; string strImgFileName = ""; bool blBegin = false; //表示到一个附件开头的标志位 bool blEnd = false; //表示到一个附件结尾的标志位 bool blDicExist = false; //表示字典文件是否存在的标志位 FileStream fsSrc = new FileStream(strSrcFilePath, FileMode.Open); StreamReader rsSrc = new StreamReader(fsSrc); StringBuilder sbSrc = new StringBuilder(); FileStream fsDic = null; StreamWriter swDic = null; FileStream fsHtml = null; StreamWriter swHtml = null; StringBuilder sbHtml = null; if (blGetHtml) { fsHtml = new FileStream(Path.GetFileNameWithoutExtension(strSrcFilePath) ".html", FileMode.Create); swHtml = new StreamWriter(fsHtml); sbHtml = new StringBuilder(); } if (blGetImg) { fsDic = new FileStream("ImgDictionary.txt", FileMode.Create); swDic = new StreamWriter(fsDic); if (!Directory.Exists("img")) Directory.CreateDirectory("img"); } int count = 0; //记录每个生成的html文件中的记录条数 int filecount = 1; //生成多个html文件时的序号 string strImgId = ""; if (blGetHtml) { //如果是获取QQ消息文本,则事先加载图片文件字典 if (File.Exists("ImgDictionary.txt")) { blDicExist = true; FileStream fsTmp = new FileStream("ImgDictionary.txt", FileMode.Open); StreamReader srTmp = new StreamReader(fsTmp); string strTmpId = ""; string strTmpSuffix = ""; string strTmpLine = ""; while (!srTmp.EndOfStream) { strTmpLine = srTmp.ReadLine(); strTmpId = strTmpLine.Substring(0, 36); strTmpSuffix = strTmpLine.Substring(37); if (!dicImg.ContainsKey(strTmpId)) dicImg.Add(strTmpId, strTmpSuffix); } srTmp.Close(); fsTmp.Close(); } } while (!rsSrc.EndOfStream) { strLine = rsSrc.ReadLine().TrimEnd(); if (blGetHtml) { //第2步操作,正文部分读取成HTML文件,5万行记录生成一个文件,并根据字典文件中的后缀信息生成对应URL if (strLine.Contains("<tr><td><div")) { if (strLine.Contains("}.dat")) { strImgId = strLine.Substring(strLine.IndexOf('{') 1, 36); if (blDicExist && dicImg.ContainsKey(strImgId)) { strLine = strLine.Replace("}.dat", "." dicImg[strImgId]); } else { strLine = strLine.Replace("}.dat", ".jpg"); } strLine = strLine.Replace("src=\"{", "src=\"img/"); } swHtml.WriteLine(strLine); count ; if (count > 50000) { count = 0; swHtml.WriteLine(strHtmlEnd); swHtml.Close(); fsHtml.Close(); filecount ; fsHtml = new FileStream(Path.GetFileNameWithoutExtension(strSrcFilePath) "-" filecount.ToString() ".html", FileMode.Create); swHtml = new StreamWriter(fsHtml); swHtml.WriteLine(strHtmlHead); } } else if (strLine.Contains(strHtmlEnd)) { swHtml.WriteLine(strLine); swHtml.Close(); fsHtml.Close(); break; } } else if (blGetImg) { //第1步操作,附件部分读取成相应的图片,并将图片名称和后缀信息保存成字典文件 if (strLine == "") { if (blBegin == true && blEnd == true) { blEnd = false; } else if (blBegin == true && blEnd == false) { blBegin = false; blEnd = true; strContent = sbSrc.ToString(); sbSrc.Remove(0, sbSrc.Length); WriteToImage(strImgFileName, strContent, strSuffix); //保存成图片文件 swDic.WriteLine(strImgFileName "," strSuffix); //写入到字典文件,用户读取正文时生成链接 } } else if (strLine.Contains("Content-Location:")) { blBegin = true; strImgFileName = strLine.Substring(18, 36); } else if (strLine.Contains("Content-Type:image/")) { strSuffix = strLine.Replace("Content-Type:image/", ""); } else if (blBegin == true) { sbSrc.Append(strLine); } } } rsSrc.Close(); fsSrc.Close(); if (blGetImg) { swDic.Close(); fsDic.Close(); } if (blGetHtml && !blDicExist) { Console.WriteLine("已完成,但未发现图片字典文件,生成的html消息记录链接会不正确,按任意键退出......."); } else { Console.WriteLine("完成,按任意键退出......."); } Console.ReadKey(); } //保存每个图片到对应的文件 private static void WriteToImage(string strFileName, string strContent, string strSuffix) { byte[] byteContent = Convert.FromBase64String(strContent); FileStream fs = new FileStream(@"img\" strFileName "." strSuffix, FileMode.Create); fs.Write(byteContent, 0, byteContent.Length); fs.Close(); } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论