zoukankan      html  css  js  c++  java
  • 基于文件夹目录生成CHM电子书

    昨天因为时间的原因,就草草的写了个比较简单的方法,调用hha.dll来编译CHM文件,昨天晚上回去,将这个方法整理到ChmHelper.dll中了,具体的代码如下:

    CHMDocument.cs文件

    添加编译的重载方法

    代码
    /// <summary>
            
    /// 使用hha.dll进行编译
            
    /// </summary>
            
    /// <param name="file"></param>
            
    /// <returns></returns>
            public bool Compile(string file)
            {
                
    this.CreateHhp();
                
    this.OpenHhc();
                
    this.OpenHhk();
                HHA_CompileHHP(
    this.strHhp, GetInfo1, GetInfo1, 0);
                
    return true;
            }


    关于hha.dll中的 代码

    代码
    delegate string GetInfo(string log);

            [DllImport(
    "hha.dll")]
            
    static extern bool HHA_CompileHHP(string hhp, GetInfo pro, GetInfo fi, int flag);

            
    public string GetInfo1(string log)
            {
                
    this.OutPutText += log;
                
    return log;
            }  


    新的创建hhp的方法

    代码
    /// <summary>
            
    /// 创建hhp文件
            
    /// </summary>
            
    /// <param name="htmFile">htm文件名</param>
            private void CreateHhp()
            {
                FileStream fs 
    = new FileStream(strHhp, FileMode.Create); //创建hhp文件
                streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding(config.EncodeType));//可能会报警告 
                streamWriter.WriteLine("[OPTIONS]");
                streamWriter.WriteLine(
    "Compatibility=1.1 or later");
                streamWriter.WriteLine(
    "Compiled file=" + "Alexis.chm");  //chm文件名,要带后缀名
                streamWriter.WriteLine("Contents file=" + strHhc);  //hhc文件名
                streamWriter.WriteLine("Index file=" + strHhk);
                streamWriter.WriteLine(
    "Default topic=" + config.DefaultPage);  //默认页
                streamWriter.WriteLine("Display compile progress=yes"); //是否显示编译过程
                streamWriter.WriteLine("Language=0x804 中文(中国)");  //chm文件语言
                streamWriter.WriteLine("Title=" + _title);//标题
                streamWriter.WriteLine("Default Window=Main");
                streamWriter.WriteLine();
                streamWriter.WriteLine(
    "[WINDOWS]");
                streamWriter.WriteLine(
    "Main=,\"xeditor.hhc\",\"xeditor.hhk\",,,,,,,0x20,180,0x104E, [80,60,720,540],0x0,0x0,,,,,0");//这里最重要了,一般默认即可
                streamWriter.WriteLine();
                streamWriter.WriteLine(
    "[FILES]");
                NodesHhp(nodeList);
                streamWriter.WriteLine();
                streamWriter.Close();
            }


    昨天的“农民伯伯”说想整个基于文件夹目录的生成CHM的软件,想了下,也不是很难,主要的难点就是如果确定子节点、父节点的关系。于是乎,昨晚花了点时间,将其实现,现将代码和实现跟大家分享:

     这个是测试的文件夹目录:

     程序的界面如下:很简单的一个界面,选择根目录,编译(使用hha.dll)

     

    这个是生成的chm电子书,基于文件夹目录的

     

     代码:

    遍历整个目录,生成父节点、子节点

    代码
    private void GetFiles(string filePath, CHMNode node)
            {
                DirectoryInfo folder 
    = new DirectoryInfo(filePath);
                node.Name 
    = folder.Name;

                FileInfo[] chldFiles 
    = folder.GetFiles("*.*");
                
    foreach (FileInfo chlFile in chldFiles)
                {
                    
    if (chlFile.Extension == ".htm" || chlFile.Extension == ".html")
                    {
                        CHMNode chldNode 
    = new CHMNode();
                        chldNode.Name 
    = chlFile.Name;
                        chldNode.Local 
    = chlFile.FullName;
                        node.Nodes.Add(chldNode);
                    }
                }

                DirectoryInfo[] chldFolders 
    = folder.GetDirectories();
                
    foreach (DirectoryInfo chldFolder in chldFolders)
                {
                    CHMNode chldNode 
    = new CHMNode();
                    chldNode.Name 
    = folder.Name;
                    node.Nodes.Add(chldNode);
                    GetFiles(chldFolder.FullName, chldNode);
                }

            }


    编译按钮,在这里设置跟节点

    代码
    private void btnComplie_Click(object sender, EventArgs e)
            {
                
    if (this.txtPath.Text=="")
                {
                    MessageBox.Show(
    "请选择目录");
                    
    return;
                }
                
                CHMDocument document 
    = new CHMDocument();
                document.FileName 
    = "Made by Alexis";
                document.Title 
    = "Alexis";//设置根目录的名字
                
    //根节点
                CHMNode root = new CHMNode();
                root.Name 
    = this.txtPath.Text.Substring(this.txtPath.Text.LastIndexOf('\\'+ 1);
                document.Nodes.Add(root);
                GetFiles(
    this.txtPath.Text, root);
                
    //编译
                document.Compile("a");
            }


    程序下载

     

  • 相关阅读:
    学习日报
    学习日报
    学习日报
    学习日报
    《人月神话》读后感(第一二章)
    线程
    for each
    类的访问属性
    异常
    输入输出流
  • 原文地址:https://www.cnblogs.com/alexis/p/1885215.html
Copyright © 2011-2022 走看看