在工作中常常需要将特定的文件提取出来生成CHM格式文件便于查阅,例如将函数头提取出生成CHM文档。
下面的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(stringSaveChmFileName)
{
//如果HHP文件已经存在则删除
if (File.Exists(SaveHHPFilePath))
{
File.Delete(SaveHHPFilePath);
}
WriteChmHHPFileHead(SaveChmFileName);
DealWithChmHHPFile(SearchFilePath);
WriteChmHHPFileTail();
}
private void DealWithChmHHPFile(stringstrFromPath)
{
//创建数组保存源文件夹下的文件名
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(stringSaveChmFileName)
{
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(stringFilePath)
{
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(stringstrFromPath)
{
//创建数组保存源文件夹下的文件名
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(stringNewFileDir)
{
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(stringNewFileDir)
{
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(stringstrFromPath)
{
//创建数组保存源文件夹下的文件名
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(stringNewFileDir)
{
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(stringHHCExeFilePath, stringHHPFilePath)
{
//创建新的进程,采用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();
}
}
}
}
测试代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace HtmlToChm
{
class Program
{
static void Main(string[] args)
{
//测试,假设在C:/1234下有些htm或html文件
string FilePath = @"C:/1234";
string ChmFileName = "我的帮助文档.CHM";
HtmlToChmClass ChmFile = new HtmlToChmClass(FilePath,ChmFileName);
ChmFile.RunChmFile(ChmFileName);
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/missvip/archive/2007/10/30/1858066.aspx