Html文件转CHM文件类--------用C#实现将html文件转换为chm文件
2007-10-30 21:31
411 查看
在工作中常常需要将特定的文件提取出来生成CHM格式文件便于查阅,例如将函数头提取出生成CHM文档。
下面的HtmlToChmClass类实现将FilePath目录下的HTML文件转化为CHM文档。
HtmlToChmClass可以很方便的运用于C#中界面程序。只需要调用相应的接口,实现与界面设计分离。
测试代码:
下面的HtmlToChmClass类实现将FilePath目录下的HTML文件转化为CHM文档。
HtmlToChmClass可以很方便的运用于C#中界面程序。只需要调用相应的接口,实现与界面设计分离。
/******************************************************************** created: 2007/10/30 created: 30:10:2007 21:12 filename: D:/C#程序练习/HtmlToChm/HtmlToChmClass.cs file path: D:/C#程序练习/HtmlToChm file base: HtmlToChmClass file ext: cs author: 凌剑/Bujiwu purpose: Html文件转CHM文件的类 *********************************************************************/ using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Diagnostics; namespace HtmlToChm { class HtmlToChmClass { //保存上一级目录 private static string OldFileDir = ""; //UL计数器 private static int ULCount = 1; //HTM文件路径 private string SearchFilePath; //HHP、HHC、HHK文件保存路径 private string SaveHHPFilePath; private string SaveHHCFilePath; private string SaveHHKFilePath; //其中FilePath为Html文件所以在路径,SaveChmFileName生成CHM文件的名称 public HtmlToChmClass(string FilePath, string SaveChmFileName) { SearchFilePath = FilePath; SaveHHPFilePath = SearchFilePath + "//Result.hhp"; SaveHHCFilePath = SearchFilePath + "//Result.hhc"; SaveHHKFilePath = SearchFilePath + "//Result.hhk"; //生成HHP、HHC、HHK文件 GetChmHHPFile(SaveChmFileName); GetChmHHCFile(); GetChmHHKFile(); //编译CHM工程 CompileChmProject(FilePath, FilePath); } //生成HHP文件 private void GetChmHHPFile(string SaveChmFileName) { //如果HHP文件已经存在则删除 if (File.Exists(SaveHHPFilePath)) { File.Delete(SaveHHPFilePath); } WriteChmHHPFileHead(SaveChmFileName); DealWithChmHHPFile(SearchFilePath); WriteChmHHPFileTail(); } private void DealWithChmHHPFile(string strFromPath) { //创建数组保存源文件夹下的文件名 string[] strFiles = Directory.GetFiles(strFromPath, "*.htm"); //循环搜索文件 for (int i = 0; i < strFiles.Length; i++) { //取得拷贝的文件名,只取文件名,地址截掉。 int Length = SearchFilePath.Length + 1; string FilePath = strFiles[i].Substring(Length, strFiles[i].Length - Length); WriteChmHHPFileBody(FilePath); } //创建DirectoryInfo实例 DirectoryInfo dirInfo = new DirectoryInfo(strFromPath); //取得源文件夹下的所有子文件夹名称 DirectoryInfo[] ZiPath = dirInfo.GetDirectories(); for (int j = 0; j < ZiPath.Length; j++) { //获取所有子文件夹名 string strZiPath = strFromPath + "//" + ZiPath[j].ToString(); //把得到的子文件夹当成新的源文件夹,从头开始新一轮的搜索 DealWithChmHHPFile(strZiPath); } } private void WriteChmHHPFileHead(string SaveChmFileName) { StreamWriter FileWrite = new StreamWriter(SaveHHPFilePath, true, Encoding.Default); FileWrite.WriteLine("[OPTIONS]"); FileWrite.WriteLine("Compatibility=1.1 or later"); FileWrite.WriteLine("Compiled file={0}", SaveChmFileName); FileWrite.WriteLine("Contents file=Result.hhc"); FileWrite.WriteLine("Index file=Result.hhk"); FileWrite.WriteLine("Title=帮助文档"); FileWrite.WriteLine("Full-text search=Yes"); FileWrite.WriteLine("Language=0x804 中文(中国)"); FileWrite.WriteLine(); FileWrite.WriteLine("[FILES]"); FileWrite.Close(); } private void WriteChmHHPFileTail() { StreamWriter FileWrite = new StreamWriter(SaveHHPFilePath, true, Encoding.Default); FileWrite.WriteLine(); FileWrite.WriteLine("[INFOTYPES]"); FileWrite.Close(); } private void WriteChmHHPFileBody(string FilePath) { StreamWriter FileWrite = new StreamWriter(SaveHHPFilePath, true, Encoding.Default); FileWrite.WriteLine(FilePath); FileWrite.Close(); } //生成HHC文件 private void GetChmHHCFile() { //如果HHC文件已经存在则删除 if (File.Exists(SaveHHCFilePath)) { File.Delete(SaveHHCFilePath); } WriteChmHHCFileHead(); DealWithChmHHCFile(SearchFilePath); WriteChmHHCFileTail(); } private void DealWithChmHHCFile(string strFromPath) { //创建数组保存源文件夹下的文件名 string[] strFiles = Directory.GetFiles(strFromPath, "*.htm"); //循环搜索文件 for (int i = 0; i < strFiles.Length; i++) { //取得拷贝的文件名,只取文件名,地址截掉。 int Length = SearchFilePath.Length + 1; string FilePath = strFiles[i].Substring(Length); WriteChmHHCFileBody(FilePath); } //创建DirectoryInfo实例 DirectoryInfo dirInfo = new DirectoryInfo(strFromPath); //取得源文件夹下的所有子文件夹名称 DirectoryInfo[] ZiPath = dirInfo.GetDirectories(); for (int j = 0; j < ZiPath.Length; j++) { //获取所有子文件夹名 string strZiPath = strFromPath + "//" + ZiPath[j].ToString(); //把得到的子文件夹当成新的源文件夹,从头开始新一轮的搜索 DealWithChmHHCFile(strZiPath); } } private void WriteChmHHCFileHead() { StreamWriter FileWrite = new StreamWriter(SaveHHCFilePath, true, Encoding.Default); FileWrite.WriteLine("<!DOCTYPE HTML PUBLIC /"-//IETF//DTD HTML//EN/">"); FileWrite.WriteLine("<HTML>"); FileWrite.WriteLine("<HEAD>"); FileWrite.WriteLine("<meta name=/"GENERATOR/" content=/"Microsoft® HTML Help Workshop 4.1/">"); FileWrite.WriteLine("<!-- Sitemap 1.0 -->"); FileWrite.WriteLine("</HEAD><BODY>"); FileWrite.WriteLine(); FileWrite.WriteLine("<UL>"); FileWrite.Close(); } private void WriteChmHHCFileTail() { StreamWriter FileWrite = new StreamWriter(SaveHHCFilePath, true, Encoding.Default); for (int i = 0; i < ULCount; i++) { FileWrite.WriteLine("</UL>"); } FileWrite.WriteLine("</BODY></HTML>"); FileWrite.Close(); } private void WriteChmHHCFileBody(string NewFileDir) { string tempNewFileDir; if (NewFileDir.LastIndexOf('//') != -1) { int Length = NewFileDir.LastIndexOf('//'); tempNewFileDir = NewFileDir.Substring(0, Length); } else { tempNewFileDir = ""; } WriteChmHHCFileUL(tempNewFileDir); StreamWriter FileWrite = new StreamWriter(SaveHHCFilePath, true, Encoding.Default); string FileName = NewFileDir.Substring(NewFileDir.LastIndexOf('//') + 1, NewFileDir.Length - NewFileDir.LastIndexOf('//') - 5); FileWrite.WriteLine(" <LI><OBJECT type=/"text/sitemap/">"); FileWrite.WriteLine(" <param name=/"Name/" value=/"{0}/">", FileName); FileWrite.WriteLine(" <param name=/"Local/" value=/"{0}/">", NewFileDir); FileWrite.WriteLine(" <param name=/"ImageNumber/" value=/"11/">"); FileWrite.WriteLine(" </OBJECT>"); FileWrite.Close(); } private void WriteChmHHCFileUL(string NewFileDir) { StreamWriter FileWrite = new StreamWriter(SaveHHCFilePath, true, Encoding.Default); string[] NewFileSplit = NewFileDir.Split(new Char[] { '//' }); string[] OldFileSplit = OldFileDir.Split(new Char[] { '//' }); int NewFileLength = NewFileSplit.Length; int OldFileLength = OldFileSplit.Length; int nCount = (NewFileLength > OldFileLength ? OldFileLength : NewFileLength); int index = 0; for (index = 0; index < nCount; index++) { if (NewFileSplit[index].ToString() != OldFileSplit[index].ToString()) { break; } } if (NewFileDir.IndexOf(OldFileDir) != -1) { for (int begin = index; begin < NewFileLength; begin++) { ULCount++; FileWrite.WriteLine(" <LI><OBJECT type=/"text/sitemap/">"); FileWrite.WriteLine(" <param name=/"Name/" value=/"{0}/">", NewFileSplit[begin]); FileWrite.WriteLine(" <param name=/"Local/" value=/"/">"); FileWrite.WriteLine(" </OBJECT>"); FileWrite.WriteLine("<UL>"); } } else { for (int begin = OldFileLength - 1; begin >= index; begin--) { ULCount--; FileWrite.WriteLine("</UL>"); } for (int begin = index; begin < NewFileLength; begin++) { ULCount++; FileWrite.WriteLine(" <LI><OBJECT type=/"text/sitemap/">"); FileWrite.WriteLine(" <param name=/"Name/" value=/"{0}/">", NewFileSplit[begin]); FileWrite.WriteLine(" <param name=/"Local/" value=/"/">"); FileWrite.WriteLine(" </OBJECT>"); FileWrite.WriteLine("<UL>"); } } FileWrite.Close(); OldFileDir = NewFileDir; } //生成HHK文件 private void GetChmHHKFile() { //如果HHK文件已经存在则删除 if (File.Exists(SaveHHKFilePath)) { File.Delete(SaveHHKFilePath); } WriteChmHHKFileHead(); DealWithChmHHKFile(SearchFilePath); WriteChmHHKFileTail(); } private void DealWithChmHHKFile(string strFromPath) { //创建数组保存源文件夹下的文件名 string[] strFiles = Directory.GetFiles(strFromPath, "*.htm"); //循环搜索文件 for (int i = 0; i < strFiles.Length; i++) { //取得拷贝的文件名,只取文件名,地址截掉。 int Length = SearchFilePath.Length + 1; string FilePath = strFiles[i].Substring(Length); WriteChmHHKFileBody(FilePath); } //创建DirectoryInfo实例 DirectoryInfo dirInfo = new DirectoryInfo(strFromPath); //取得源文件夹下的所有子文件夹名称 DirectoryInfo[] ZiPath = dirInfo.GetDirectories(); for (int j = 0; j < ZiPath.Length; j++) { //获取所有子文件夹名 string strZiPath = strFromPath + "//" + ZiPath[j].ToString(); //把得到的子文件夹当成新的源文件夹,从头开始新一轮的搜索 DealWithChmHHKFile(strZiPath); } } private void WriteChmHHKFileHead() { StreamWriter FileWrite = new StreamWriter(SaveHHKFilePath, true, Encoding.Default); FileWrite.WriteLine("<!DOCTYPE HTML PUBLIC /"-//IETF//DTD HTML//EN/">"); FileWrite.WriteLine("<HTML>"); FileWrite.WriteLine("<HEAD>"); FileWrite.WriteLine("<meta name=/"GENERATOR/" content=/"Microsoft® HTML Help Workshop 4.1/">"); FileWrite.WriteLine("<!-- Sitemap 1.0 -->"); FileWrite.WriteLine("</HEAD><BODY>"); FileWrite.WriteLine(); FileWrite.WriteLine("<UL>"); FileWrite.Close(); } private void WriteChmHHKFileTail() { StreamWriter FileWrite = new StreamWriter(SaveHHKFilePath, true, Encoding.Default); FileWrite.WriteLine("</UL>"); FileWrite.WriteLine("</BODY></HTML>"); FileWrite.Close(); } private void WriteChmHHKFileBody(string NewFileDir) { StreamWriter FileWrite = new StreamWriter(SaveHHKFilePath, true, Encoding.Default); string FileName = NewFileDir.Substring(NewFileDir.LastIndexOf('//') + 1, NewFileDir.Length - NewFileDir.LastIndexOf('//') - 5); FileWrite.WriteLine(" <LI><OBJECT type=/"text/sitemap/">"); FileWrite.WriteLine(" <param name=/"Name/" value=/"{0}/">", FileName); FileWrite.WriteLine(" <param name=/"Local/" value=/"{0}/">", NewFileDir); FileWrite.WriteLine(" <param name=/"ImageNumber/" value=/"11/">"); FileWrite.WriteLine(" </OBJECT>"); FileWrite.Close(); } //编译CHM工程HHCExeFilePath为hhc.exe文件的目录HHPFilePath为生成的HHP文件目录 private void CompileChmProject(string HHCExeFilePath, string HHPFilePath) { //创建新的进程,采用Process启动HHC.EXE来Compile一个CHM文件 Process helpCompileProcess = new Process(); try { ProcessStartInfo processStartInfo = new ProcessStartInfo(); processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; processStartInfo.FileName = HHCExeFilePath + "//hhc.exe"; processStartInfo.Arguments = HHPFilePath + "//Result.hhp"; helpCompileProcess.StartInfo = processStartInfo; //开始编译CHM文件 helpCompileProcess.Start(); //编译直到HHC.exe进程退出 helpCompileProcess.WaitForExit(); } finally { helpCompileProcess.Close(); } } //运行生成的CHM文件SaveChmFileName为CHM的文件名称 public void RunChmFile(string SaveChmFileName) { //创建新的进程,采用Process启动HHC.EXE来Compile一个CHM文件 Process helpCompileProcess = new Process(); try { ProcessStartInfo processStartInfo = new ProcessStartInfo(); processStartInfo.WindowStyle = ProcessWindowStyle.Normal; processStartInfo.FileName = SearchFilePath + "//" + SaveChmFileName; helpCompileProcess.StartInfo = processStartInfo; //运行CHM文件 helpCompileProcess.Start(); } finally { helpCompileProcess.Close(); } } } } |
[align=left]using System;[/align] [align=left]using System.Collections.Generic;[/align] [align=left]using System.Text;[/align] [align=left]namespace HtmlToChm[/align] [align=left]{[/align] [align=left] class Program[/align] [align=left] {[/align] [align=left] static void Main(string[] args)[/align] [align=left] {[/align] [align=left] //测试,假设在C:/1234下有些htm或html文件[/align] [align=left] string FilePath = @"C:/1234";[/align] string ChmFileName = "我的帮助文档.CHM"; HtmlToChmClass ChmFile = new HtmlToChmClass(FilePath,ChmFileName); [align=left] ChmFile.RunChmFile(ChmFileName);[/align] [align=left] }[/align] [align=left] }[/align] [align=left]}[/align] |
相关文章推荐
- Html文件转CHM文件类--------用C#实现将html文件转换为chm文件
- Html文件转CHM文件类--------用C#实现将html文件转换为chm文件
- 用C#实现将HTML文件转换为CHM文件(转) - C#探索者 - 博客园
- [转]用C#实现将HTML文件转换为CHM文件
- 用C#实现将HTML文件转换为CHM文件(转)
- 用C#实现将HTML文件转换为CHM文件(转)
- 用C#实现将html文件转换为chm文件
- 用C#实现将html文件转换为chm文件
- 用C#实现将html文件转换为chm文件 (转)
- 用C#实现将HTML文件转换为CHM文件(转)
- C# 实现DataTable、DataSet与XML互相转换
- C#实现office文档转换为PDF格式
- C#编程实现对象与JSON串互相转换实例分析
- C# 反射实现IList 到DataSet的转换
- c#实现16进制和字符串之间转换的代码
- C#实现office文档转换为PDF格式
- 用C#实现十六进制字符串转换为ASCII
- c#实现操作FTP文件类的应用
- c#使用简单工厂模式实现生成html文件的封装类分享
- 实现C#和VB.net之间的相互转换