PNDiff界面如下图1所示主要分成Title, Menu, Button, Compare和status这几个区域。Title区域用来显示当前比较的文件全路径;Menu区域有File, Edit, View, Diff, Tool和Help菜单,File菜单用来打开/增加/减少用来比较的文件,Edit菜单可以对打开的文件做一些简单的编辑,View菜单用来设置文件的颜色/字体/参数/语法,Diff菜单用来设置/清除/比较/列表/跳转文本比对,Tool菜单用来打开查看系统信息(System Information)、文件加解密(Encrypt/Decrypt)、文件分解和合并(Split/Join)以及文件列表打印(Directory Print)这几个小工具,Help菜单用来打开用户手册、查看版本信息。Button区域有File, Edit, Search, Diff, Review, Tool和Help按钮,其功能和菜单栏中对应的类似。Compare区域显示diff比较的结果,这个结果是和文件中的内容对应的,分别找出行和列不一致的地方并用不同的颜色标识出来。Status区域主要显示当前比较的文件名以及比较的结果。
图1 PNDiff窗口各区域
PNDiff提供了多种可配置的文本比对模式,用户可以根据自己的需求做相应的配置进行比对,点击菜单栏或者按钮中的Diff Setting可以打开下图2设置界面,在这个设置界面中可以分别配置行模式,列模式和行范围,根据配置的值分别做相应的文本比对。
图2 Diff模式设置窗口
在行模式配置中有Auto,Precise和Customized这三个模式选择,如下图3所示。
图3 Diff行模式设置
Auto行模式,PNDiff在做文本行比对时会根据读入的文本行数自动生成一个行偏移值和一个块偏移值。这两个偏移值的作用是被用来在比对时做展开比较使用的,行偏移值表示文件在比较时将从当前行扩展偏移值个再做行内容的比较,块偏移值表示文件在比较时将从当前行扩展偏移值个再做块内容的比较。
图4 Diff行模式Auto示例
如上图4例子所示,在行的Auto模式下test_old_line和test_new_line这两个文件在比较时,根据自动设置的行/块偏移值在文件中找到一个符合行偏移之后相同的行,即test_old_line文件中的第4行和test_new_line文件中的第2行。找到该相同行之后将这两行再做对齐,即将test_old_line文件中的2-3行标识为多余行”Redu”,并将test_new_line文件中在第1行和第二行之间插入两个遗漏行”Miss”。
Precise行模式,PNDiff在做文本行比对时会将读入的文本进行逐行比较。
图5 Diff行模式Precise示例
如上图5例子所示,在行的Precise模式下test_old_line和test_new_line这两个文件在比较时,由于是逐行比较,取这两个文件中最少的行数16行,先将test_old_line文件中的第1-16行和test_new_line文件中的第1-16行逐行比较,没有一行能匹配上,两个文件的1-16行都表示为不同行”Diff”。再对这两个文件做行尾对齐,即将test_old_line文件中在行尾16行后插入10个遗漏行 ”Miss”,并将test_new_line文件中的第17-26行标识为多余行”Redu”。
Customized行模式,PNDiff在做文本行比对时会根据设置的行偏移值I-NUM和块偏移值B-NUM分别做相应的行和块偏移的比较。
图6 Diff行模式Customized示例1
图7 Diff行模式Customized示例2
图8 Diff行模式Customized示例3
如上图6、图7和图8例子所示,在行的Customized模式下test_old_line和test_new_line这两个文件在比较时,根据用户自定义设置的行/块偏移值做比较,图6中行偏移值为5、块偏移值为8,根据该偏移值做偏移比较之后发现了一个相同的行即test_old_line文件中的第4行和test_new_line文件中的第2行。图7中行偏移值为8、块偏移值为8,根据该偏移值做偏移比较之后发现了两个相同的行即test_old_line文件中的第4行和test_new_line文件中的第2行相同,以及test_old_line文件中的第6行和test_new_line文件中的第10行相同。图8中行偏移值为8、块偏移值为20,根据该偏移值做偏移比较之后发现了两个相同的行即test_old_line文件中的第4行和test_new_line文件中的第2行相同,test_old_line文件中的第6行和test_new_line文件中的第10行相同,以及一个相同的块(超过一行相同的成为块相同)即test_old_line文件中的第8-9行和test_new_line文件中的第24-25行相同。
在列模式配置中有Auto,Precise和Customized这三个模式选择,如下图9所示。另外列模式还有一个有效的选项Column Enable,当取消该选项的设置时则不对不同行做列内容的比较,如下图10所示。
图9 Diff列模式设置
图10 Diff列比较取消
Auto列模式,PNDiff在做文本列比对时会对当前有不同的行再做列比较,从行首和行尾分别逐个字符比较,将行首开始比较的第一个不相同的字符位置作为列不同的起始点,将行尾开始比较的第一个不相同的字符位置作为列不同的结束点,在该行上再标记起始点至结束点作为列不同。
图11 Diff列模式Auto示例
如上图11例子所示,在列的Auto模式下test_old_column和test_new_column这两个文件这一个不同行”Diff”在做列比较时,从行首开始向后比对找到第一个不同的字符出现在第7列,再从行尾开始向前比对找到第一个不同的字符出现在倒数第3列。这样就在test_old_column和test_new_column这两个文件这一行标识第7列至倒数第3列为不同列。
Precise列模式,PNDiff在做文本列比对时会对当前有不同的行按word分解然后逐个word做比较,在做word比较时也是有两个比较,一个是从word的第一个字符向后开始逐个字符比较,直到发现第一个不同的地方记录下来作为该word的列不同的起始点,另外一个是从word的尾向前逐个字符比较,直到发现第一个不同的地方记录下来作为该word的列不同的结束点。
图12 Diff列模式Precise示例
如上图12例子所示,在列的Precise模式下test_old_column和test_new_column这两个文件这一个不同行”Diff”在做列比较时,先将行中的字符按word分解,然后按word逐个比较。第一个word都是”aaaa”相同;第二个word对应test_old_column是”bbbb”和test_new_column是”babb”,这里标识这个word中的第二个字符为不同列;第三个word对应test_old_column是”cccc”和test_new_column是”bbbb”,这里标识整个word为不同列;第四个word都是”dddd”相同;第五个word对应test_old_column是”xx$$”和test_new_column是”xxxx”,这里标识这个word中的第三和四个字符为不同列;第六个word对应test_old_column是”%%%%”和test_new_column是”yyyy”,这里标识整个word为不同列;第七个word对应test_old_column是”zzz#”和test_new_column是”zzzz”,这里标识这个word中的第四个字符为不同列;第八个word对应test_old_column是”xxxx”和test_new_column是”1111”,这里标识整个word为不同列;第九个word都是”2222”相同;第十个word对应test_old_column是”3333”和test_new_column是”3233”,这里标识这个word中的第二个字符为不同列。
Customized列模式,PNDiff在做文本列比对时会对当前有不同的行按word分解然后根据配置的I-NUM做word的偏移比较,如果当前word在偏移的范围内找到相同的word则跳转到下一个word并将该word之前的word标记为列的不同,做word的偏移比较直到第一个行尾为止并标记其余行那些未结束的word为列的不同。
图13 Diff列模式Customized示例1
图14 Diff列模式Customized示例2
如上图13和图14例子所示,在列的Customized模式下test_old_column和test_new_column这两个文件这一个不同行”Diff”在做列比较时,先将行中的字符按word分解,然后根据设置的列偏移值做word偏移比较。图13例子中设置的列偏移值为3,根据该偏移值做word偏移之后找到一个word偏移相同,即test_old_column中的第2个word和test_new_column中的第3个word相同都是”bbbb”。图14例子中设置的列偏移值为6,根据该偏移值做word偏移之后找到两个word偏移相同,即test_old_column中的第2个word和test_new_column中的第3个word相同都是”bbbb”,以及test_old_column中的第8个word和test_new_column中的第5个word相同都是”xxxx”。
在行范围配置中有Line All和Line Sel这两个个模式选择,如下图15所示。
图15 Diff行范围设置
Line All行范围,PNDiff在做文本比对时会对所有的行根据不同的行/列模式都做相应的比对。Line Sel行范围,PNDiff在做文本比对时仅在所选择的行区间内对所选择的行根据不同的行/列模式设置做相应的比对。
图16 Diff行范围Line Sel示例
如上图16例子所示,在行范围的Line Sel模式下test_old_line和test_new_line这两个文件在比较时,根据设置的行范围值2-14行,仅在选中的行范围中做比较,其余非选中的范围,即前段的test_old_line和test_new_line文件中的第1行,以及后段的test_old_line文件中的15-16行并在14和15行之间插入12个空白行补齐,test_new_line文件中的第13-26行,将超出范围的前段和后段这些行都标识为不比行”Nocare”。
PNDiff在对文本做完比对之后会对其结果用不同的颜色做相应的标识,如下图16所示,对test_old.tcl、test_mid.tcl和 test_new.tcl这三个文件做比对,结果共找出45个不一致的地方。对这些不一致的地方标识分为行标识和列标识,行标识有:不同行”Line Diff”,将三个文件中对应的行内容不一致的行用颜色标记出来;多余行”Line Redu”,根据行/块偏移值找出三个文件偏移之后有相同的行内容,对于那些偏移之后多余的行用颜色标记出来;遗漏行”Line Miss”,根据行/块偏移值找出三个文件偏移之后有相同的行内容,对于那些偏移之后遗漏需要补齐的行用颜色标记出来;不比行”Line Nocare”,将三个文件中对应选择不比对的行用颜色标记出来。列标识只对那些不同行”Line Diff”的行再做该行的列比对,根据列比对的设置做相应的列比对,将列不同的地方标识为不同列”Column Diff”,用颜色标记出来这些不同的列。
图16 Diff比较结果颜色标识
文本比对结果查看方式有很多种,可以通过菜单、按钮、快捷菜单以及结果列表这些方式方便快速的查看文本比对的结果。
图17 Diff比较结果查看菜单
如上图17所示是在PNDiff界面中的”Menu Area”其中”Diff”这个菜单下拉之后有”Goto Review”选项表示跳转到输入的需要查看的不同项上,”Goto Prev” 选项表示跳转到当前不同项的前一个不同项上, ”Goto Next” 选项表示跳转到当前不同项的后一个不同项上。
图18 Diff比较结果查看按钮
如上图18所示是在PNDiff界面中的”Button Area”其中”Review”这个栏中按钮表示跳转到当前不同项的前一个不同项上, 按钮表示跳转到当前不同项的后一个不同项上,输入框用于显示和输入当前查看的不同项,按钮表示跳转到输入的需要查看的不同项上。
图19 Diff比较结果查看快捷菜单
如上图19所示是在PNDiff界面中的”Compare Area”在比对完成后鼠标右键弹出该快捷菜单,其中”Goto Prev”选项表示跳转到当前不同项的前一个不同项上,”Goto Next”表示跳转到当前不同项的后一个不同项上,”Goto First”表示跳转到第一个不同项上,”Goto Last”表示跳转到最后一个不同项上。
图20 Diff比较结果查看列表
如上图20所示是在PNDiff界面中的比对结果菜单或者按钮打开一个比对结果列表,在该列表中分页(每页100个项)显示当前所有的比对结果,用户可以选中其中的某一个不同项,双击该项则比对结果界面也会相应的跳转到该不同项内容上。
如下图21所示是对test_old.tcl、test_mid.tcl和 test_new.tcl这三个文件做比对,结果共找出45个不一致的地方。对这些比对不一致地方PNDiff还可以通过比对结果列表中的”Merge”功能如下图22所示,对其进行合并操作。其中合并有All、Select和Range这三个模式;在合并时需要选择源文件,如下图23所示选择了test_old.tcl和test_mid.tcl这两个文件作为源,在合并时还需要选择目标文件,如下图24所示选择了test_new.tcl这个文件作为目标;由于合并的操作是修改合并对象的源文件且不可恢复,因此在点击合并按钮之后会先弹出一个”Question [irrve]”窗口如下图25所示,需要用户确认是否做合并操作,在确认之后才会根据设置做相应的合并。
图21 Diff比较结果(未合并)
图22 Diff比较结果合并设置
图23 Diff比较结果合并源文件
图24 Diff比较结果合并目标文件
图25 Diff比较结果合并确认
All合并模式,如下图26所示在合并模式中选择了”All”模式,即对所有比对不同的项(共45项)都做合并操作。合并的源文件是test_old.tcl和test_mid.tcl,目标文件是test_new.tcl,即将源文件中不同项的内容修改成目标文件中对应项的内容。下图27所示是该模式设置下合并之后的结果,可以看到合并之后对应的源文件test_old.tcl和test_mid.tcl已将所有的不同项都修改成了目标文件test_new.tcl对应的内容。
图26 Diff比较结果全部合并设置
图27 Diff比较结果全部合并结果
Select合并模式,如下图28所示在合并模式中选择了”Select”模式并在结果列表中选中了1、3、6、8和10这几个不同项,即仅对选中的这五个不同的项做合并操作。合并的源文件是test_old.tcl和test_mid.tcl,目标文件是test_new.tcl,即将源文件中不同项的内容修改成目标文件中对应项的内容。下图29所示是该模式设置下合并之后的结果,可以看到合并之后对应的源文件test_old.tcl和test_mid.tcl已将对应的1、3、6、8和10不同项都修改成了目标文件test_new.tcl对应的内容。
图28 Diff比较结果选择合并设置
图29 Diff比较结果选择合并结果
Range合并模式,如下图30所示在合并模式中选择了”Range”模式并在区间选择了起始值为2和结束值为10这个范围,即仅对选中的2-10这九个不同的项做合并操作。合并的源文件是test_old.tcl和test_mid.tcl,目标文件是test_new.tcl,即将源文件中不同项的内容修改成目标文件中对应项的内容。下图31所示是该模式设置下合并之后的结果,可以看到合并之后对应的源文件test_old.tcl和test_mid.tcl已将对应的2-10不同项都修改成了目标文件test_new.tcl对应的内容。
图30 Diff比较结果范围合并设置
图31 Diff比较结果范围合并结果