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

CHMDocument.cs文件

添加编译的重载方法

  1. /// <summary>
  2. /// 使用hha.dll进行编译
  3. /// </summary>
  4. /// <param name="file"></param>
  5. /// <returns></returns>
  6. public bool Compile(string file)
  7. {
  8. this.CreateHhp();
  9. this.OpenHhc();
  10. this.OpenHhk();
  11. HHA_CompileHHP(this.strHhp, GetInfo1, GetInfo1, 0);
  12. return true;
  13. }

关于hha.dll中的 代码

  1. delegate string GetInfo(string log);
  2. [DllImport("hha.dll")]
  3. static extern bool HHA_CompileHHP(string hhp, GetInfo pro, GetInfo fi, int flag);
  4. public string GetInfo1(string log)
  5. {
  6. this.OutPutText += log;
  7. return log;
  8. }

新的创建hhp的方法

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

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

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

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

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

代码:

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

  1. private void GetFiles(string filePath, CHMNode node)
  2. {
  3. DirectoryInfo folder = new DirectoryInfo(filePath);
  4. node.Name = folder.Name;
  5. FileInfo[] chldFiles = folder.GetFiles("*.*");
  6. foreach (FileInfo chlFile in chldFiles)
  7. {
  8. if (chlFile.Extension == ".htm" || chlFile.Extension == ".html")
  9. {
  10. CHMNode chldNode = new CHMNode();
  11. chldNode.Name = chlFile.Name;
  12. chldNode.Local = chlFile.FullName;
  13. node.Nodes.Add(chldNode);
  14. }
  15. }
  16. DirectoryInfo[] chldFolders = folder.GetDirectories();
  17. foreach (DirectoryInfo chldFolder in chldFolders)
  18. {
  19. CHMNode chldNode = new CHMNode();
  20. chldNode.Name = folder.Name;
  21. node.Nodes.Add(chldNode);
  22. GetFiles(chldFolder.FullName, chldNode);
  23. }
  24. }

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

  1. private void btnComplie_Click(object sender, EventArgs e)
  2. {
  3. if (this.txtPath.Text=="")
  4. {
  5. MessageBox.Show("请选择目录");
  6. return;
  7. }
  8. CHMDocument document = new CHMDocument();
  9. document.FileName = "Made by Alexis";
  10. document.Title = "Alexis";//设置根目录的名字
  11. //根节点
  12. CHMNode root = new CHMNode();
  13. root.Name = this.txtPath.Text.Substring(this.txtPath.Text.LastIndexOf('\\') + 1);
  14. document.Nodes.Add(root);
  15. GetFiles(this.txtPath.Text, root);
  16. //编译
  17. document.Compile("a");
  18. }

程序下载

附件:http://down.51cto.com/data/2358219

本文转自xshf12345 51CTO博客,原文链接:http://blog.51cto.com/alexis/574540,如需转载请自行联系原作者

基于文件夹目录生成CHM电子书相关推荐

  1. 使用 Python 生成文件夹目录结构

    新建一个 python 文件,复制以下代码,运行时指定一下 ignore_list 和 direction_path 即可快速生成文件夹目录结构图. import re from pathlib im ...

  2. 自动生成文件夹目录结构文档

    文件夹 目录结构 自动生成 安装 mddir # 全局安装 mddir 插件 npm install mddir -g 使用 mddir 进入要生成的文件夹根目录,输入 mddir mddir 执行完 ...

  3. linux各个文件夹作用是什么,我的世界游戏文件夹目录作用介绍 各个文件夹都是什么用...

    我的世界游戏文件夹目录作用介绍 各个文件夹都是什么用.那下面给大家介绍的则是我的世界游戏文件夹目录索引的内容哦~那到底在我的世界文件夹中各个文件夹都有设么作用呢?那下面一一介绍一下吧! 游戏园我的世界 ...

  4. 安卓Android手机系统内文件夹目录解释

    Bluestorm's Space 博客园 首页 新随笔 联系 订阅 管理 随笔- 423 文章- 3 评论- 58  /storage/sdcard, /sdcard, /mnt/sdcard 三者 ...

  5. Node.js复制/删除服务器端文件到指定目录文件夹下,并且预判是否存在该目录,如果没有,则递归创建该文件夹目录

    注意,前情提示: 本代码基于<Node.js(nodejs)对本地JSON文件进行增.删.改.查操作(轻车熟路)> 传送门Node.js(nodejs)对本地JSON文件进行增.删.改.查 ...

  6. 文件夹目录结构导出工具及下载

    一.功能和使用说明 "文件夹目录导出工具"能够实现将指定的文件夹下的所有文件和子文件夹的名字以三种方式导出.这种三种方式分别是:网页文件,xml文件和文本方式显示. 操作方法非常简 ...

  7. js 删除服务器文件,Node.js复制/删除服务器端文件到指定目录文件夹下,并且预判是否存在该目录,如果没有,则递归创建该文件夹目录...

    注意,前情提示: 本代码基于<Node.js(nodejs)对本地JSON文件进行增.删.改.查操作(轻车熟路)> 传送门https://blog.csdn.net/qq_37860634 ...

  8. php scandir 目录树,使用php scandir函数遍历文件夹目录和所有文件

    使用php scandir函数遍历文件夹目录和所有文件 $dir = "."; //当前目录 list_file($dir); function list_file($dir){ ...

  9. php获取目录文件 排序输出,php实现对文件夹目录中的文件进行排序的方法

    php实现对文件夹目录中的文件按照时间.名称.大小进行排序的方法 函数介绍: opendir() 函数打开目录句柄. readdir() 函数返回目录中下一个文件的文件名. array_multiso ...

  10. node 修改html文件路径,好程序员前端教程-nodejs如何读取文件夹目录的内容

    好程序员前端教程-nodejs如何读取文件夹目录的内容? 首先,nodejs中文件,目录的操作,我们对fs文件系统分为两类操作,第一类是xxx方法,第二类是xxxSync方法.所有的fs操作几乎都是这 ...

最新文章

  1. Linux Kernel TCP/IP Stack — L3 Layer — netfilter/iptables 防火墙
  2. 乱码问题产生的原因与解决方案---UTF-8
  3. ORA-01841: (完整) 年份值必须介于 -4713 和 +9999 之间, 且不为 0情况解决
  4. 利用双向循环链表实现长整数的存储_重学数据结构之链表篇
  5. iOS毛玻璃效果(第一次写~有点紧张喔)
  6. Python实现将一个长度为n的列表划分 ,每个子列表中包含m个元素
  7. Activity singleTop启动模式
  8. 开展网络口碑营销之前必须做好的几件事
  9. android软路由,软路由体验 篇一:  100块钱还要啥自行车,软路由初体验
  10. 大数据行业前景_大数据未来展望
  11. 计算机控制台程序,什么是电脑控制台,是DOS设定吗?
  12. html缩小照片尺寸像素不变,怎么把图片变小 像素不变
  13. BUCK电流检测分析
  14. 路由追踪程序traceroute/tracert分析与科普
  15. Reactor 和 Proactor 区别
  16. 对共享单车摆放问题的调研
  17. 以下关于python文件的描述_关于 Python 文件处理 , 以下选项中描述正确的是 : ( )_学小易找答案...
  18. 创建苹果软件应用时app lcon图片问题.
  19. 【CSS03】CSS基础03_文本_字体
  20. 2020.12.23 ps临摹调色

热门文章

  1. vue-element-admin 后台管理系统
  2. MikroTik(RouteOS)有线路由器快速设置教程
  3. 项目使用微信公众平台图片显示此图片来自微信公众平台 解决方法
  4. stream从list实体类筛选出符合条件的单个实体类
  5. 广告词 android,广告语猜猜看
  6. 显示器3d测试软件,IPS显示屏/裸眼3D显示原理及3D应用
  7. 客户至上 | 国产BI领跑者,思迈特软件完成C轮融资
  8. [完]PHP 格式化显示时间 date() 函数
  9. SHEL中调用uci
  10. SpringSecurity实现登陆认证并返回token