複製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

相關文章
相關標籤/搜索