基于文件夹目录生成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进行编译
/// </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;
}
[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();
}
/// 创建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);
}
}
{
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");
}
{
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");
}
如果您喜欢我的文章,您可以通过支付宝对我进行捐助,您的支持是我最大的动力https://me.alipay.com/alexis
作者:Alexis
出处:http://www.cnblogs.com/alexis/
关于作者:专注于Windows Phone 7、Silverlight、Web前端(jQuery)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过shuifengxuATgmail.com 联系我,非常感谢。