复制K2流程图实现记录

  开发K2流程中,不少时候流程都是类似的,因此但愿经过复制一个现有流程图再进行修改,达到快速开发提升工做效率,但经过右键对一个现有的流程图进行复制,复制后流程图并非一个全新的流程图,还会保留部分原流程图的相关信息。因此查阅了相关的资料,也有一些人也提出相同的问题,但并无找到相应的解决方案。还有一种是经过K2 API类库使用代码的方式生成kprx文件,但这个并非适合咱们的需求,由于咱们还对默认生成代码进行修改,因此才有下面的方案。html

流程图分析

  先经过查看(*.kprx)文件,使用记事本查看文件内容,了解K2流程图使用XML格式进行数据存储。接下来咱们就能够建立两个新流程图,而后使用对比工具进行比对,查找差别。经过对比后发现只有GUID还有流程名称会有变化。正则表达式

K2 GUID格式定义

  • GUID小写,格式”D”。

    98873e50-a321-439b-8c40-991f82d90005工具

  • GUID小写,格式”N”,也多是格式”D”的变种。

    98873e50a321439b8c40991f82d90005ui

  • GUID小写,格式”B”。

    {b7b8c232-de89-446f-99e1-23d203cda63a}spa

  • GUID大写,格式”D”,不须要替换。

    FDA04D27-504A-4D24-A5BC-854E8CF395E0设计

GUID格式参考

说明符 返回值的格式
N

32 位数字:3d

00000000000000000000000000000000code

D

由连字符分隔的 32 位数字:htm

00000000-0000-0000-0000-000000000000blog

B

由连字符,括在大括号分隔的 32 位数字:

{00000000-0000-0000-0000-000000000000}

P

由括在括号中的连字符分隔的 32 位数字:

(00000000-0000-0000-0000-000000000000)

X

四个十六进制值括在大括号,其中第四个值是也括在大括号的八个十六进制值的子集:

{0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}

K2 GUID做用补充

  虽说K2流程图是以XML格式进行存储,但经过K2 设计器或者进行编译项目操做,K2会对流程图进行转换生成代码项目。

  • 因此经过一个现有流程进行复制,会提示如下相似问题。

  

  • 生成代码的路径
  C:\Users\用户名\AppData\Local\Temp\ExtenderProjects
  • 各个流程图以CSWinWF-GUID为项目名称。
  
  • 一样的,节点相关代码也是含有GUID的。
  

实现方案

  经过上述分析的结果,咱们就能够用正则表达式查找出全部小写的GUID,而后过滤掉重复(包括格式"D"的变种),以后使用替换方法,对旧的GUID生成一个新的GUID。

示例代码:

            var processes = Directory.GetFiles(OutputFolderPath, "*.kprx", SearchOption.AllDirectories);
            foreach (var fileName in processes)
            {
                var file = new FileInfo(fileName);
                var fileContent = File.ReadAllText(fileName, Encoding.UTF8);
                //获取K2流程图全部小写字母GUID
                var pattern = "[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}|[a-f0-9]{8}([a-f0-9]{4}){3}[a-f0-9]{12}";
                Regex regex = new Regex(pattern);
                MatchCollection matchCollection = regex.Matches(fileContent);
                var guidList = new List<Guid>();
                foreach (Match match in matchCollection)
                {
                    var guid = new Guid(match.Value);
                    if (!guidList.Contains(guid))
                    {
                        guidList.Add(guid);
                    }
                }
                //将全部GUID替换为新的GUID
                foreach (var guid in guidList)
                {
                    if (guid != Guid.Empty)
                    {
                        var newGuid = Guid.NewGuid();
                        fileContent = fileContent.Replace(guid.ToString("D"), newGuid.ToString("D"));
                        fileContent = fileContent.Replace(guid.ToString("N"), newGuid.ToString("N"));
                    }
                }
                //写入文件
                File.WriteAllText(fileName, fileContent, Encoding.UTF8);
            }

总结

  虽然最终实现复制流程图的想法,对K2流程图的分析也没有错,但在这个过程当中碰到的坑还很多,尝试了无数种可能,生成了无数次,生成出来的流程图打开都报错了,将生成出来的流程图对比原来的流程图,都没有发现任何问题。

想过是否是GUID正则表达式有问题?
想过是否是GUID替换有问题?
想过是否是有些GUID是固定的?

  纠结了无数天,比较两个流程图眼睛都看花了,仍是没有找到根源。最后索性新建一个只有一个K2节点流程图,减小生成的内容,经过手工比对依次一个个替换,从新加载流程图,直到替换到出现错误。最终发现一个相同GUID使用了有两种格式"D"和"N",差点没吐血。总之,有成功的喜悦,也有失败的启示。

参考资料

https://msdn.microsoft.com/zh-cn/library/97af8hh4.aspx
http://community.k2.com/t5/K2-blackpearl/copy-and-rename-a-process/td-p/24383
https://www.k2.com/onlinehelp/k2blackpearl/devref/current/default.htm#Create_Process.html