開發K2流程中,不少時候流程都是類似的,因此但願經過複製一個現有流程圖再進行修改,達到快速開發提升工做效率,但經過右鍵對一個現有的流程圖進行復制,複製後流程圖並非一個全新的流程圖,還會保留部分原流程圖的相關信息。因此查閱了相關的資料,也有一些人也提出相同的問題,但並無找到相應的解決方案。還有一種是經過K2 API類庫使用代碼的方式生成kprx文件,但這個並非適合咱們的需求,由於咱們還對默認生成代碼進行修改,因此纔有下面的方案。html
先經過查看(*.kprx)文件,使用記事本查看文件內容,瞭解K2流程圖使用XML格式進行數據存儲。接下來咱們就能夠建立兩個新流程圖,而後使用對比工具進行比對,查找差別。經過對比後發現只有GUID還有流程名稱會有變化。正則表達式
98873e50-a321-439b-8c40-991f82d90005工具
98873e50a321439b8c40991f82d90005ui
{b7b8c232-de89-446f-99e1-23d203cda63a}spa
FDA04D27-504A-4D24-A5BC-854E8CF395E0設計
說明符 | 返回值的格式 |
---|---|
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流程圖是以XML格式進行存儲,但經過K2 設計器或者進行編譯項目操做,K2會對流程圖進行轉換生成代碼項目。
經過上述分析的結果,咱們就能夠用正則表達式查找出全部小寫的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