复制K2流程图实现记录
开发K2流程中,很多时候流程都是相似的,所以希望通过复制一个现有流程图再进行修改,达到快速开发提高工作效率,但通过右键对一个现有的流程图进行复制,复制后流程图并不是一个全新的流程图,还会保留部分原流程图的相关信息。所以查阅了相关的资料,也有一些人也提出相同的问题,但并没有找到相应的解决方案。还有一种是通过K2 API类库使用代码的方式生成kprx文件,但这个并不是适合我们的需求,因为我们还对默认生成代码进行修改,所以才有下面的方案。
流程图分析
先通过查看(*.kprx)文件,使用记事本查看文件内容,了解K2流程图使用XML格式进行数据存储。接下来我们就可以创建两个新流程图,然后使用对比工具进行比对,查找差异。通过对比后发现只有GUID还有流程名称会有变化。
K2 GUID格式定义
- GUID小写,格式”D”。
98873e50-a321-439b-8c40-991f82d90005
- GUID小写,格式”N”,也可能是格式”D”的变种。
98873e50a321439b8c40991f82d90005
- GUID小写,格式”B”。
{b7b8c232-de89-446f-99e1-23d203cda63a}
- GUID大写,格式”D”,不需要替换。
FDA04D27-504A-4D24-A5BC-854E8CF395E0
GUID格式参考
说明符 | 返回值的格式 |
---|---|
N |
32 位数字: 00000000000000000000000000000000 |
D |
由连字符分隔的 32 位数字: 00000000-0000-0000-0000-000000000000 |
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会对流程图进行转换生成代码项目。
- 所以通过一个现有流程进行复制,会提示以下类似问题。
- 生成代码的路径
- 各个流程图以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
作 者:
优易应软件工作室
出 处:
http://www.cnblogs.com/youyiying
关于作者:专注于微软平台的项目开发。
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者
直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角
【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!