在工作中常常需要将特定的文件提取出来生成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(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&reg; 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&reg; 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();

            }

        }

    }

}

 

 测试代码:

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);
        }
    }
}
 

Posted on 2008-09-18 20:12  hemry  阅读(1116)  评论(0编辑  收藏  举报