Page 1 of 1

Simple Folder Compare App

Posted: Wed Sep 21, 2011 2:42 pm
by treebolt
Should be a helpful little tool where I work. I know there are plenty of free ones out there with more features, but I wrote it anyway out of boredom.

Demonstrates walking through folders to find content pretty well I think..

Code: Select all

Enumeration
  #CHECKSUM
  
  #STRING_PATH1
  #STRING_PATH2
  #BUTTON_GENERATEREPORT
  #BUTTON_RESET
  #BUTTON_IGNOREEXT
  #TREE1
  #TREE2
  
  #TEXT_TREE1
  #TEXT_TREE2
  
  #TEXT_MESSAGE
  
  #IMAGE_FOLDERICON
  #IMAGE_FILEICON
  
  #DIR
  
  #REPORT
  #REPORTFILE
  #REPORT_FRAME
  #REPORT_BOX_PATH1ALSO
  #REPORT_BOX_PATH1NOT
  #REPORT_BOX_PATH2ALSO
  #REPORT_BOX_PATH2NOT
  #REPORT_BOX_ITEMCOUNTS
  #REPORT_BOX_FULLLIST1
  #REPORT_BOX_FULLLIST2
  #REPORT_BUTTON_SAVE
EndEnumeration

CreateImage(#IMAGE_FOLDERICON,16,16)
StartDrawing(ImageOutput(#IMAGE_FOLDERICON))
  Box(0,0,1,1,RGB(255,255,255))
  Box(0,1,1,1,RGB(255,255,255))
  Box(0,2,1,1,RGB(255,255,255))
  Box(0,3,1,1,RGB(0,0,0))
  Box(0,4,1,1,RGB(0,0,0))
  Box(0,5,1,1,RGB(0,0,0))
  Box(0,6,1,1,RGB(0,0,0))
  Box(0,7,1,1,RGB(0,0,0))
  Box(0,8,1,1,RGB(0,0,0))
  Box(0,9,1,1,RGB(0,0,0))
  Box(0,10,1,1,RGB(0,0,0))
  Box(0,11,1,1,RGB(0,0,0))
  Box(0,12,1,1,RGB(0,35,59))
  Box(0,13,1,1,RGB(255,255,255))
  Box(0,14,1,1,RGB(255,255,255))
  Box(0,15,1,1,RGB(255,255,255))
  Box(1,0,1,1,RGB(255,255,255))
  Box(1,1,1,1,RGB(255,255,255))
  Box(1,2,1,1,RGB(0,0,0))
  Box(1,3,1,1,RGB(204,255,255))
  Box(1,4,1,1,RGB(174,227,243))
  Box(1,5,1,1,RGB(131,205,229))
  Box(1,6,1,1,RGB(93,188,219))
  Box(1,7,1,1,RGB(58,176,215))
  Box(1,8,1,1,RGB(3,157,205))
  Box(1,9,1,1,RGB(0,160,215))
  Box(1,10,1,1,RGB(0,173,230))
  Box(1,11,1,1,RGB(0,176,235))
  Box(1,12,1,1,RGB(0,193,255))
  Box(1,13,1,1,RGB(0,0,0))
  Box(1,14,1,1,RGB(255,255,255))
  Box(1,15,1,1,RGB(255,255,255))
  Box(2,0,1,1,RGB(255,255,255))
  Box(2,1,1,1,RGB(255,255,255))
  Box(2,2,1,1,RGB(0,0,0))
  Box(2,3,1,1,RGB(255,255,255))
  Box(2,4,1,1,RGB(177,203,212))
  Box(2,5,1,1,RGB(137,182,197))
  Box(2,6,1,1,RGB(98,163,184))
  Box(2,7,1,1,RGB(62,147,176))
  Box(2,8,1,1,RGB(0,119,160))
  Box(2,9,1,1,RGB(0,125,169))
  Box(2,10,1,1,RGB(0,136,181))
  Box(2,11,1,1,RGB(0,143,191))
  Box(2,12,1,1,RGB(0,207,255))
  Box(2,13,1,1,RGB(0,0,0))
  Box(2,14,1,1,RGB(255,255,255))
  Box(2,15,1,1,RGB(255,255,255))
  Box(3,0,1,1,RGB(255,255,255))
  Box(3,1,1,1,RGB(255,255,255))
  Box(3,2,1,1,RGB(0,0,0))
  Box(3,3,1,1,RGB(255,255,255))
  Box(3,4,1,1,RGB(159,191,202))
  Box(3,5,1,1,RGB(126,174,190))
  Box(3,6,1,1,RGB(88,158,179))
  Box(3,7,1,1,RGB(56,143,173))
  Box(3,8,1,1,RGB(0,117,157))
  Box(3,9,1,1,RGB(0,125,168))
  Box(3,10,1,1,RGB(0,136,181))
  Box(3,11,1,1,RGB(0,142,190))
  Box(3,12,1,1,RGB(0,206,255))
  Box(3,13,1,1,RGB(0,0,0))
  Box(3,14,1,1,RGB(255,255,255))
  Box(3,15,1,1,RGB(255,255,255))
  Box(4,0,1,1,RGB(255,255,255))
  Box(4,1,1,1,RGB(255,255,255))
  Box(4,2,1,1,RGB(0,0,0))
  Box(4,3,1,1,RGB(255,255,255))
  Box(4,4,1,1,RGB(161,192,203))
  Box(4,5,1,1,RGB(127,175,190))
  Box(4,6,1,1,RGB(89,158,180))
  Box(4,7,1,1,RGB(57,143,173))
  Box(4,8,1,1,RGB(0,117,157))
  Box(4,9,1,1,RGB(0,125,168))
  Box(4,10,1,1,RGB(0,136,181))
  Box(4,11,1,1,RGB(0,142,190))
  Box(4,12,1,1,RGB(0,206,255))
  Box(4,13,1,1,RGB(0,0,0))
  Box(4,14,1,1,RGB(255,255,255))
  Box(4,15,1,1,RGB(255,255,255))
  Box(5,0,1,1,RGB(255,255,255))
  Box(5,1,1,1,RGB(255,255,255))
  Box(5,2,1,1,RGB(0,0,0))
  Box(5,3,1,1,RGB(255,255,255))
  Box(5,4,1,1,RGB(159,191,202))
  Box(5,5,1,1,RGB(126,175,190))
  Box(5,6,1,1,RGB(89,156,180))
  Box(5,7,1,1,RGB(57,145,173))
  Box(5,8,1,1,RGB(0,120,161))
  Box(5,9,1,1,RGB(0,124,168))
  Box(5,10,1,1,RGB(0,136,181))
  Box(5,11,1,1,RGB(0,142,190))
  Box(5,12,1,1,RGB(0,206,255))
  Box(5,13,1,1,RGB(0,0,0))
  Box(5,14,1,1,RGB(255,255,255))
  Box(5,15,1,1,RGB(255,255,255))
  Box(6,0,1,1,RGB(255,255,255))
  Box(6,1,1,1,RGB(255,255,255))
  Box(6,2,1,1,RGB(0,0,0))
  Box(6,3,1,1,RGB(255,255,255))
  Box(6,4,1,1,RGB(182,208,215))
  Box(6,5,1,1,RGB(126,174,191))
  Box(6,6,1,1,RGB(88,156,179))
  Box(6,7,1,1,RGB(57,144,172))
  Box(6,8,1,1,RGB(8,124,164))
  Box(6,9,1,1,RGB(0,123,167))
  Box(6,10,1,1,RGB(0,136,181))
  Box(6,11,1,1,RGB(0,142,190))
  Box(6,12,1,1,RGB(0,206,255))
  Box(6,13,1,1,RGB(0,0,0))
  Box(6,14,1,1,RGB(255,255,255))
  Box(6,15,1,1,RGB(255,255,255))
  Box(7,0,1,1,RGB(255,255,255))
  Box(7,1,1,1,RGB(255,255,255))
  Box(7,2,1,1,RGB(0,0,0))
  Box(7,3,1,1,RGB(44,137,166))
  Box(7,4,1,1,RGB(173,221,236))
  Box(7,5,1,1,RGB(153,200,217))
  Box(7,6,1,1,RGB(88,155,179))
  Box(7,7,1,1,RGB(53,143,171))
  Box(7,8,1,1,RGB(23,133,169))
  Box(7,9,1,1,RGB(0,122,166))
  Box(7,10,1,1,RGB(0,136,180))
  Box(7,11,1,1,RGB(0,142,190))
  Box(7,12,1,1,RGB(0,206,255))
  Box(7,13,1,1,RGB(0,0,0))
  Box(7,14,1,1,RGB(255,255,255))
  Box(7,15,1,1,RGB(255,255,255))
  Box(8,0,1,1,RGB(255,255,255))
  Box(8,1,1,1,RGB(255,255,255))
  Box(8,2,1,1,RGB(255,255,255))
  Box(8,3,1,1,RGB(0,0,0))
  Box(8,4,1,1,RGB(0,0,0))
  Box(8,5,1,1,RGB(178,229,244))
  Box(8,6,1,1,RGB(87,155,178))
  Box(8,7,1,1,RGB(49,140,170))
  Box(8,8,1,1,RGB(36,139,173))
  Box(8,9,1,1,RGB(0,122,167))
  Box(8,10,1,1,RGB(0,135,180))
  Box(8,11,1,1,RGB(0,142,190))
  Box(8,12,1,1,RGB(0,206,255))
  Box(8,13,1,1,RGB(0,0,0))
  Box(8,14,1,1,RGB(255,255,255))
  Box(8,15,1,1,RGB(255,255,255))
  Box(9,0,1,1,RGB(255,255,255))
  Box(9,1,1,1,RGB(255,255,255))
  Box(9,2,1,1,RGB(255,255,255))
  Box(9,3,1,1,RGB(255,255,255))
  Box(9,4,1,1,RGB(0,0,0))
  Box(9,5,1,1,RGB(192,245,255))
  Box(9,6,1,1,RGB(86,154,178))
  Box(9,7,1,1,RGB(46,139,168))
  Box(9,8,1,1,RGB(42,142,175))
  Box(9,9,1,1,RGB(0,125,168))
  Box(9,10,1,1,RGB(0,135,180))
  Box(9,11,1,1,RGB(0,142,190))
  Box(9,12,1,1,RGB(0,206,255))
  Box(9,13,1,1,RGB(0,0,0))
  Box(9,14,1,1,RGB(255,255,255))
  Box(9,15,1,1,RGB(255,255,255))
  Box(10,0,1,1,RGB(255,255,255))
  Box(10,1,1,1,RGB(255,255,255))
  Box(10,2,1,1,RGB(255,255,255))
  Box(10,3,1,1,RGB(255,255,255))
  Box(10,4,1,1,RGB(0,0,0))
  Box(10,5,1,1,RGB(192,245,255))
  Box(10,6,1,1,RGB(87,155,178))
  Box(10,7,1,1,RGB(46,139,168))
  Box(10,8,1,1,RGB(43,143,176))
  Box(10,9,1,1,RGB(0,126,170))
  Box(10,10,1,1,RGB(0,133,180))
  Box(10,11,1,1,RGB(0,143,190))
  Box(10,12,1,1,RGB(0,206,255))
  Box(10,13,1,1,RGB(0,0,0))
  Box(10,14,1,1,RGB(255,255,255))
  Box(10,15,1,1,RGB(255,255,255))
  Box(11,0,1,1,RGB(255,255,255))
  Box(11,1,1,1,RGB(255,255,255))
  Box(11,2,1,1,RGB(255,255,255))
  Box(11,3,1,1,RGB(255,255,255))
  Box(11,4,1,1,RGB(0,0,0))
  Box(11,5,1,1,RGB(192,245,255))
  Box(11,6,1,1,RGB(87,155,178))
  Box(11,7,1,1,RGB(46,139,168))
  Box(11,8,1,1,RGB(45,143,176))
  Box(11,9,1,1,RGB(0,126,170))
  Box(11,10,1,1,RGB(0,133,180))
  Box(11,11,1,1,RGB(0,143,190))
  Box(11,12,1,1,RGB(0,206,255))
  Box(11,13,1,1,RGB(0,0,0))
  Box(11,14,1,1,RGB(255,255,255))
  Box(11,15,1,1,RGB(255,255,255))
  Box(12,0,1,1,RGB(255,255,255))
  Box(12,1,1,1,RGB(255,255,255))
  Box(12,2,1,1,RGB(255,255,255))
  Box(12,3,1,1,RGB(255,255,255))
  Box(12,4,1,1,RGB(0,0,0))
  Box(12,5,1,1,RGB(191,244,255))
  Box(12,6,1,1,RGB(85,154,177))
  Box(12,7,1,1,RGB(45,138,168))
  Box(12,8,1,1,RGB(43,143,176))
  Box(12,9,1,1,RGB(0,127,168))
  Box(12,10,1,1,RGB(0,133,180))
  Box(12,11,1,1,RGB(0,143,190))
  Box(12,12,1,1,RGB(0,206,255))
  Box(12,13,1,1,RGB(0,0,0))
  Box(12,14,1,1,RGB(255,255,255))
  Box(12,15,1,1,RGB(255,255,255))
  Box(13,0,1,1,RGB(255,255,255))
  Box(13,1,1,1,RGB(255,255,255))
  Box(13,2,1,1,RGB(255,255,255))
  Box(13,3,1,1,RGB(255,255,255))
  Box(13,4,1,1,RGB(0,0,0))
  Box(13,5,1,1,RGB(210,255,255))
  Box(13,6,1,1,RGB(102,165,185))
  Box(13,7,1,1,RGB(57,144,174))
  Box(13,8,1,1,RGB(45,144,178))
  Box(13,9,1,1,RGB(0,124,168))
  Box(13,10,1,1,RGB(0,136,181))
  Box(13,11,1,1,RGB(0,143,191))
  Box(13,12,1,1,RGB(0,207,255))
  Box(13,13,1,1,RGB(0,0,0))
  Box(13,14,1,1,RGB(255,255,255))
  Box(13,15,1,1,RGB(255,255,255))
  Box(14,0,1,1,RGB(255,255,255))
  Box(14,1,1,1,RGB(255,255,255))
  Box(14,2,1,1,RGB(255,255,255))
  Box(14,3,1,1,RGB(255,255,255))
  Box(14,4,1,1,RGB(0,0,0))
  Box(14,5,1,1,RGB(146,235,255))
  Box(14,6,1,1,RGB(73,177,210))
  Box(14,7,1,1,RGB(40,167,208))
  Box(14,8,1,1,RGB(26,168,213))
  Box(14,9,1,1,RGB(0,159,215))
  Box(14,10,1,1,RGB(0,173,230))
  Box(14,11,1,1,RGB(0,183,244))
  Box(14,12,1,1,RGB(0,200,255))
  Box(14,13,1,1,RGB(0,0,0))
  Box(14,14,1,1,RGB(255,255,255))
  Box(14,15,1,1,RGB(255,255,255))
  Box(15,0,1,1,RGB(255,255,255))
  Box(15,1,1,1,RGB(255,255,255))
  Box(15,2,1,1,RGB(255,255,255))
  Box(15,3,1,1,RGB(255,255,255))
  Box(15,4,1,1,RGB(0,0,0))
  Box(15,5,1,1,RGB(0,0,0))
  Box(15,6,1,1,RGB(0,0,0))
  Box(15,7,1,1,RGB(0,0,0))
  Box(15,8,1,1,RGB(0,0,0))
  Box(15,9,1,1,RGB(0,0,0))
  Box(15,10,1,1,RGB(0,0,0))
  Box(15,11,1,1,RGB(0,0,0))
  Box(15,12,1,1,RGB(0,0,0))
  Box(15,13,1,1,RGB(255,255,255))
  Box(15,14,1,1,RGB(255,255,255))
  Box(15,15,1,1,RGB(255,255,255))
StopDrawing()


CreateImage(#IMAGE_FILEICON,16,16)
StartDrawing(ImageOutput(#IMAGE_FILEICON))
  Box(0,0,1,1,RGB(255,255,255))
  Box(0,1,1,1,RGB(255,255,255))
  Box(0,2,1,1,RGB(255,255,255))
  Box(0,3,1,1,RGB(255,255,255))
  Box(0,4,1,1,RGB(255,255,255))
  Box(0,5,1,1,RGB(255,255,255))
  Box(0,6,1,1,RGB(255,255,255))
  Box(0,7,1,1,RGB(255,255,255))
  Box(0,8,1,1,RGB(255,255,255))
  Box(0,9,1,1,RGB(255,255,255))
  Box(0,10,1,1,RGB(255,255,255))
  Box(0,11,1,1,RGB(255,255,255))
  Box(0,12,1,1,RGB(255,255,255))
  Box(0,13,1,1,RGB(255,255,255))
  Box(0,14,1,1,RGB(255,255,255))
  Box(0,15,1,1,RGB(255,255,255))
  Box(1,0,1,1,RGB(255,255,255))
  Box(1,1,1,1,RGB(255,255,255))
  Box(1,2,1,1,RGB(255,255,255))
  Box(1,3,1,1,RGB(255,255,255))
  Box(1,4,1,1,RGB(255,255,255))
  Box(1,5,1,1,RGB(255,255,255))
  Box(1,6,1,1,RGB(255,255,255))
  Box(1,7,1,1,RGB(255,255,255))
  Box(1,8,1,1,RGB(255,255,255))
  Box(1,9,1,1,RGB(255,255,255))
  Box(1,10,1,1,RGB(255,255,255))
  Box(1,11,1,1,RGB(255,255,255))
  Box(1,12,1,1,RGB(255,255,255))
  Box(1,13,1,1,RGB(255,255,255))
  Box(1,14,1,1,RGB(255,255,255))
  Box(1,15,1,1,RGB(255,255,255))
  Box(2,0,1,1,RGB(255,255,255))
  Box(2,1,1,1,RGB(0,0,0))
  Box(2,2,1,1,RGB(0,0,0))
  Box(2,3,1,1,RGB(0,0,0))
  Box(2,4,1,1,RGB(0,0,0))
  Box(2,5,1,1,RGB(0,0,0))
  Box(2,6,1,1,RGB(0,0,0))
  Box(2,7,1,1,RGB(0,0,0))
  Box(2,8,1,1,RGB(0,0,0))
  Box(2,9,1,1,RGB(0,0,0))
  Box(2,10,1,1,RGB(0,0,0))
  Box(2,11,1,1,RGB(0,0,0))
  Box(2,12,1,1,RGB(0,0,0))
  Box(2,13,1,1,RGB(0,0,0))
  Box(2,14,1,1,RGB(255,255,255))
  Box(2,15,1,1,RGB(255,255,255))
  Box(3,0,1,1,RGB(255,255,255))
  Box(3,1,1,1,RGB(0,0,0))
  Box(3,2,1,1,RGB(0,206,255))
  Box(3,3,1,1,RGB(0,206,255))
  Box(3,4,1,1,RGB(0,206,255))
  Box(3,5,1,1,RGB(0,206,255))
  Box(3,6,1,1,RGB(0,206,255))
  Box(3,7,1,1,RGB(0,206,255))
  Box(3,8,1,1,RGB(0,206,255))
  Box(3,9,1,1,RGB(0,206,255))
  Box(3,10,1,1,RGB(0,206,255))
  Box(3,11,1,1,RGB(0,206,255))
  Box(3,12,1,1,RGB(0,206,255))
  Box(3,13,1,1,RGB(0,0,0))
  Box(3,14,1,1,RGB(143,143,143))
  Box(3,15,1,1,RGB(255,255,255))
  Box(4,0,1,1,RGB(255,255,255))
  Box(4,1,1,1,RGB(0,0,0))
  Box(4,2,1,1,RGB(0,206,255))
  Box(4,3,1,1,RGB(255,255,255))
  Box(4,4,1,1,RGB(255,255,255))
  Box(4,5,1,1,RGB(255,255,255))
  Box(4,6,1,1,RGB(255,255,255))
  Box(4,7,1,1,RGB(255,255,255))
  Box(4,8,1,1,RGB(255,255,255))
  Box(4,9,1,1,RGB(255,255,255))
  Box(4,10,1,1,RGB(255,255,255))
  Box(4,11,1,1,RGB(255,255,255))
  Box(4,12,1,1,RGB(0,117,157))
  Box(4,13,1,1,RGB(0,0,0))
  Box(4,14,1,1,RGB(143,143,143))
  Box(4,15,1,1,RGB(255,255,255))
  Box(5,0,1,1,RGB(255,255,255))
  Box(5,1,1,1,RGB(0,0,0))
  Box(5,2,1,1,RGB(0,206,255))
  Box(5,3,1,1,RGB(255,255,255))
  Box(5,4,1,1,RGB(255,255,255))
  Box(5,5,1,1,RGB(255,255,255))
  Box(5,6,1,1,RGB(255,255,255))
  Box(5,7,1,1,RGB(0,0,0))
  Box(5,8,1,1,RGB(255,255,255))
  Box(5,9,1,1,RGB(255,255,255))
  Box(5,10,1,1,RGB(0,0,0))
  Box(5,11,1,1,RGB(255,255,255))
  Box(5,12,1,1,RGB(0,117,157))
  Box(5,13,1,1,RGB(0,0,0))
  Box(5,14,1,1,RGB(143,143,143))
  Box(5,15,1,1,RGB(255,255,255))
  Box(6,0,1,1,RGB(255,255,255))
  Box(6,1,1,1,RGB(0,0,0))
  Box(6,2,1,1,RGB(0,206,255))
  Box(6,3,1,1,RGB(255,255,255))
  Box(6,4,1,1,RGB(255,255,255))
  Box(6,5,1,1,RGB(255,255,255))
  Box(6,6,1,1,RGB(255,255,255))
  Box(6,7,1,1,RGB(0,0,0))
  Box(6,8,1,1,RGB(255,255,255))
  Box(6,9,1,1,RGB(255,255,255))
  Box(6,10,1,1,RGB(0,0,0))
  Box(6,11,1,1,RGB(255,255,255))
  Box(6,12,1,1,RGB(0,117,157))
  Box(6,13,1,1,RGB(0,0,0))
  Box(6,14,1,1,RGB(143,143,143))
  Box(6,15,1,1,RGB(255,255,255))
  Box(7,0,1,1,RGB(255,255,255))
  Box(7,1,1,1,RGB(0,0,0))
  Box(7,2,1,1,RGB(0,206,255))
  Box(7,3,1,1,RGB(255,255,255))
  Box(7,4,1,1,RGB(255,255,255))
  Box(7,5,1,1,RGB(255,255,255))
  Box(7,6,1,1,RGB(255,255,255))
  Box(7,7,1,1,RGB(0,0,0))
  Box(7,8,1,1,RGB(255,255,255))
  Box(7,9,1,1,RGB(255,255,255))
  Box(7,10,1,1,RGB(0,0,0))
  Box(7,11,1,1,RGB(255,255,255))
  Box(7,12,1,1,RGB(0,117,157))
  Box(7,13,1,1,RGB(0,0,0))
  Box(7,14,1,1,RGB(143,143,143))
  Box(7,15,1,1,RGB(255,255,255))
  Box(8,0,1,1,RGB(255,255,255))
  Box(8,1,1,1,RGB(0,0,0))
  Box(8,2,1,1,RGB(0,0,0))
  Box(8,3,1,1,RGB(0,0,0))
  Box(8,4,1,1,RGB(0,0,0))
  Box(8,5,1,1,RGB(0,0,0))
  Box(8,6,1,1,RGB(255,255,255))
  Box(8,7,1,1,RGB(0,0,0))
  Box(8,8,1,1,RGB(255,255,255))
  Box(8,9,1,1,RGB(255,255,255))
  Box(8,10,1,1,RGB(0,0,0))
  Box(8,11,1,1,RGB(255,255,255))
  Box(8,12,1,1,RGB(0,117,157))
  Box(8,13,1,1,RGB(0,0,0))
  Box(8,14,1,1,RGB(143,143,143))
  Box(8,15,1,1,RGB(255,255,255))
  Box(9,0,1,1,RGB(255,255,255))
  Box(9,1,1,1,RGB(207,207,207))
  Box(9,2,1,1,RGB(43,43,43))
  Box(9,3,1,1,RGB(255,255,255))
  Box(9,4,1,1,RGB(255,255,255))
  Box(9,5,1,1,RGB(0,0,0))
  Box(9,6,1,1,RGB(255,255,255))
  Box(9,7,1,1,RGB(255,255,255))
  Box(9,8,1,1,RGB(255,255,255))
  Box(9,9,1,1,RGB(255,255,255))
  Box(9,10,1,1,RGB(255,255,255))
  Box(9,11,1,1,RGB(255,255,255))
  Box(9,12,1,1,RGB(0,117,157))
  Box(9,13,1,1,RGB(0,0,0))
  Box(9,14,1,1,RGB(143,143,143))
  Box(9,15,1,1,RGB(255,255,255))
  Box(10,0,1,1,RGB(255,255,255))
  Box(10,1,1,1,RGB(255,255,255))
  Box(10,2,1,1,RGB(176,176,176))
  Box(10,3,1,1,RGB(33,33,33))
  Box(10,4,1,1,RGB(255,255,255))
  Box(10,5,1,1,RGB(0,0,0))
  Box(10,6,1,1,RGB(255,255,255))
  Box(10,7,1,1,RGB(255,255,255))
  Box(10,8,1,1,RGB(255,255,255))
  Box(10,9,1,1,RGB(255,255,255))
  Box(10,10,1,1,RGB(255,255,255))
  Box(10,11,1,1,RGB(255,255,255))
  Box(10,12,1,1,RGB(0,117,157))
  Box(10,13,1,1,RGB(0,0,0))
  Box(10,14,1,1,RGB(143,143,143))
  Box(10,15,1,1,RGB(255,255,255))
  Box(11,0,1,1,RGB(255,255,255))
  Box(11,1,1,1,RGB(255,255,255))
  Box(11,2,1,1,RGB(255,255,255))
  Box(11,3,1,1,RGB(180,180,180))
  Box(11,4,1,1,RGB(31,31,31))
  Box(11,5,1,1,RGB(0,0,0))
  Box(11,6,1,1,RGB(0,117,157))
  Box(11,7,1,1,RGB(0,117,157))
  Box(11,8,1,1,RGB(0,117,157))
  Box(11,9,1,1,RGB(0,117,157))
  Box(11,10,1,1,RGB(0,117,157))
  Box(11,11,1,1,RGB(0,117,157))
  Box(11,12,1,1,RGB(0,117,157))
  Box(11,13,1,1,RGB(0,0,0))
  Box(11,14,1,1,RGB(143,143,143))
  Box(11,15,1,1,RGB(255,255,255))
  Box(12,0,1,1,RGB(255,255,255))
  Box(12,1,1,1,RGB(255,255,255))
  Box(12,2,1,1,RGB(255,255,255))
  Box(12,3,1,1,RGB(255,255,255))
  Box(12,4,1,1,RGB(175,175,175))
  Box(12,5,1,1,RGB(0,0,0))
  Box(12,6,1,1,RGB(0,0,0))
  Box(12,7,1,1,RGB(0,0,0))
  Box(12,8,1,1,RGB(0,0,0))
  Box(12,9,1,1,RGB(0,0,0))
  Box(12,10,1,1,RGB(0,0,0))
  Box(12,11,1,1,RGB(0,0,0))
  Box(12,12,1,1,RGB(0,0,0))
  Box(12,13,1,1,RGB(0,0,0))
  Box(12,14,1,1,RGB(143,143,143))
  Box(12,15,1,1,RGB(255,255,255))
  Box(13,0,1,1,RGB(255,255,255))
  Box(13,1,1,1,RGB(255,255,255))
  Box(13,2,1,1,RGB(255,255,255))
  Box(13,3,1,1,RGB(255,255,255))
  Box(13,4,1,1,RGB(255,255,255))
  Box(13,5,1,1,RGB(227,227,227))
  Box(13,6,1,1,RGB(143,143,143))
  Box(13,7,1,1,RGB(143,143,143))
  Box(13,8,1,1,RGB(143,143,143))
  Box(13,9,1,1,RGB(143,143,143))
  Box(13,10,1,1,RGB(143,143,143))
  Box(13,11,1,1,RGB(143,143,143))
  Box(13,12,1,1,RGB(143,143,143))
  Box(13,13,1,1,RGB(143,143,143))
  Box(13,14,1,1,RGB(143,143,143))
  Box(13,15,1,1,RGB(255,255,255))
  Box(14,0,1,1,RGB(255,255,255))
  Box(14,1,1,1,RGB(255,255,255))
  Box(14,2,1,1,RGB(255,255,255))
  Box(14,3,1,1,RGB(255,255,255))
  Box(14,4,1,1,RGB(255,255,255))
  Box(14,5,1,1,RGB(255,255,255))
  Box(14,6,1,1,RGB(255,255,255))
  Box(14,7,1,1,RGB(255,255,255))
  Box(14,8,1,1,RGB(255,255,255))
  Box(14,9,1,1,RGB(255,255,255))
  Box(14,10,1,1,RGB(255,255,255))
  Box(14,11,1,1,RGB(255,255,255))
  Box(14,12,1,1,RGB(255,255,255))
  Box(14,13,1,1,RGB(255,255,255))
  Box(14,14,1,1,RGB(255,255,255))
  Box(14,15,1,1,RGB(255,255,255))
  Box(15,0,1,1,RGB(255,255,255))
  Box(15,1,1,1,RGB(255,255,255))
  Box(15,2,1,1,RGB(255,255,255))
  Box(15,3,1,1,RGB(255,255,255))
  Box(15,4,1,1,RGB(255,255,255))
  Box(15,5,1,1,RGB(255,255,255))
  Box(15,6,1,1,RGB(255,255,255))
  Box(15,7,1,1,RGB(255,255,255))
  Box(15,8,1,1,RGB(255,255,255))
  Box(15,9,1,1,RGB(255,255,255))
  Box(15,10,1,1,RGB(255,255,255))
  Box(15,11,1,1,RGB(255,255,255))
  Box(15,12,1,1,RGB(255,255,255))
  Box(15,13,1,1,RGB(255,255,255))
  Box(15,14,1,1,RGB(255,255,255))
  Box(15,15,1,1,RGB(255,255,255))
StopDrawing()

Global folderIcon = ImageID(#IMAGE_FOLDERICON)
Global fileIcon = ImageID(#IMAGE_FILEICON)
Global color_exsists1 = RGB(107,245,170)
Global color_exsists0 = RGB(255,150,150)

Structure dirStuff
  path.s
  name.s
  nameNoExt.s
  dirLevel.l
  fof.l
  exsists.l
EndStructure

Global NewList path1Stuff.dirStuff()
Global NewList path2Stuff.dirStuff()
Global path1.s,path2.s
Global SIM1.l,SIM2.l,DIF1.l,DIF2.l

Global ENDREPORT.l = 0
Global ENDCHECKSUM.l

Procedure error(message.s) : MessageRequester("Checksum - ERROR",message) : EndProcedure

Procedure findAndAddPath1(cFL.l,relPath.s)
  path1.s = GetGadgetText(#STRING_PATH1)
  If ExamineDirectory(cFL,path1+relPath,"")
    Repeat
      WEvent = WindowEvent() : If WEvent = #PB_Event_CloseWindow : End : EndIf 
      If IsDirectory(cFL)
        NDEResult = NextDirectoryEntry(cFL)
        If NDEResult <> 0
          If DirectoryEntryType(cFL) = #PB_DirectoryEntry_Directory And DirectoryEntryName(cFL) <> "." And DirectoryEntryName(cFL) <> ".."
            AddElement(path1Stuff())
            path1Stuff()\path = relPath
            path1Stuff()\name = DirectoryEntryName(cFL)
            path1Stuff()\dirLevel = cFL
            path1Stuff()\fof = #PB_DirectoryEntry_Directory
            findAndAddPath1(cFL+1,relPath+DirectoryEntryName(cFL)+"\")
          ElseIf DirectoryEntryType(cFL) = #PB_DirectoryEntry_File And DirectoryEntryName(cFL) <> "." And DirectoryEntryName(cFL) <> ".."  And UCase(DirectoryEntryName(cFL)) <> "THUMBS.DB"
            AddElement(path1Stuff())
            path1Stuff()\path = relPath
            path1Stuff()\name = DirectoryEntryName(cFL)
            ext.s = "."+GetExtensionPart(path1Stuff()\name)
            path1Stuff()\nameNoExt = Mid(path1Stuff()\name,1,Len(path1Stuff()\name)-Len(ext))
            path1Stuff()\dirLevel = cFL
            path1Stuff()\fof = #PB_DirectoryEntry_File
            SetGadgetText(#TEXT_MESSAGE,"Looking for files..."+path1Stuff()\name)
          EndIf
        EndIf
      EndIf
    Until NDEResult = 0
    FinishDirectory(cFL)
  EndIf
EndProcedure

Procedure findAndAddPath2(cFL.l,relPath.s)
  path2.s = GetGadgetText(#STRING_PATH2)
  If ExamineDirectory(cFL,path2+relPath,"")
    Repeat
      WEvent = WindowEvent() : If WEvent = #PB_Event_CloseWindow : End : EndIf 
      If IsDirectory(cFL)
        NDEResult = NextDirectoryEntry(cFL)
        If NDEResult <> 0
          If DirectoryEntryType(cFL) = #PB_DirectoryEntry_Directory And DirectoryEntryName(cFL) <> "." And DirectoryEntryName(cFL) <> ".."
            AddElement(path2Stuff())
            path2Stuff()\path = relPath
            path2Stuff()\name = DirectoryEntryName(cFL)
            path2Stuff()\dirLevel = cFL
            path2Stuff()\fof = #PB_DirectoryEntry_Directory
            findAndAddPath2(cFL+1,relPath+DirectoryEntryName(cFL)+"\")
          ElseIf DirectoryEntryType(cFL) = #PB_DirectoryEntry_File And DirectoryEntryName(cFL) <> "." And DirectoryEntryName(cFL) <> ".."  And UCase(DirectoryEntryName(cFL)) <> "THUMBS.DB"
            AddElement(path2Stuff())
            path2Stuff()\path = relPath
            path2Stuff()\name = DirectoryEntryName(cFL)
            ext.s = "."+GetExtensionPart(path2Stuff()\name)
            path2Stuff()\nameNoExt = Mid(path2Stuff()\name,1,Len(path2Stuff()\name)-Len(ext))
            path2Stuff()\dirLevel = cFL
            path2Stuff()\fof = #PB_DirectoryEntry_File
            SetGadgetText(#TEXT_MESSAGE,"Looking for files..."+path2Stuff()\name)
          EndIf
        EndIf
      EndIf
    Until NDEResult = 0
    FinishDirectory(cFL)
  EndIf
EndProcedure

Procedure refreshPath1Stuff()
  ClearGadgetItemList(#TREE1)
  SIM1 = 0
  DIF1 = 0
  
  Select GetGadgetState(#BUTTON_IGNOREEXT)
    Case 0
      ForEach path1Stuff()
        If path1Stuff()\fof = #PB_DirectoryEntry_Directory
          AddGadgetItem(#TREE1,-1,path1Stuff()\name,folderIcon,path1Stuff()\dirLevel)
        Else
          AddGadgetItem(#TREE1,-1,path1Stuff()\name,fileIcon,path1Stuff()\dirLevel)
        EndIf
        
        If path1Stuff()\exsists = 1
          SetGadgetItemColor(#TREE1,CountGadgetItems(#TREE1)-1,#PB_Gadget_BackColor,color_exsists1)
          SIM1 + 1
        Else
          SetGadgetItemColor(#TREE1,CountGadgetItems(#TREE1)-1,#PB_Gadget_BackColor,color_exsists0)
          DIF1 + 1
        EndIf
      Next
    Case 1
      ForEach path1Stuff()
        If path1Stuff()\fof = #PB_DirectoryEntry_Directory
          AddGadgetItem(#TREE1,-1,path1Stuff()\name,folderIcon,path1Stuff()\dirLevel)
        Else
          AddGadgetItem(#TREE1,-1,path1Stuff()\nameNoExt,fileIcon,path1Stuff()\dirLevel)
        EndIf
        
        If path1Stuff()\exsists = 1
          SetGadgetItemColor(#TREE1,CountGadgetItems(#TREE1)-1,#PB_Gadget_BackColor,color_exsists1)
          SIM1 + 1
        Else
          SetGadgetItemColor(#TREE1,CountGadgetItems(#TREE1)-1,#PB_Gadget_BackColor,color_exsists0)
          DIF1 + 1
        EndIf
      Next
  EndSelect
  SetGadgetText(#TEXT_TREE1,"#SIMILAR="+Str(SIM1)+" | #DIFFERENT="+Str(DIF1))
EndProcedure

Procedure refreshPath2Stuff()
  ClearGadgetItemList(#TREE2)
  SIM2 = 0
  DIF2 = 0
  Select GetGadgetState(#BUTTON_IGNOREEXT)
    Case 0
      ForEach path2Stuff()
        If path2Stuff()\fof = #PB_DirectoryEntry_Directory
          AddGadgetItem(#TREE2,-1,path2Stuff()\name,folderIcon,path2Stuff()\dirLevel)
        Else
          AddGadgetItem(#TREE2,-1,path2Stuff()\name,fileIcon,path2Stuff()\dirLevel)
        EndIf
        
        If path2Stuff()\exsists = 1
          SetGadgetItemColor(#TREE2,CountGadgetItems(#TREE2)-1,#PB_Gadget_BackColor,color_exsists1)
          SIM2 + 1
        Else
          SetGadgetItemColor(#TREE2,CountGadgetItems(#TREE2)-1,#PB_Gadget_BackColor,color_exsists0)
          DIF2 + 1
        EndIf
      Next
    Case 1
      ForEach path2Stuff()
        If path2Stuff()\fof = #PB_DirectoryEntry_Directory
          AddGadgetItem(#TREE2,-1,path2Stuff()\name,folderIcon,path2Stuff()\dirLevel)
        Else
          AddGadgetItem(#TREE2,-1,path2Stuff()\nameNoExt,fileIcon,path2Stuff()\dirLevel)
        EndIf
        
        If path2Stuff()\exsists = 1
          SetGadgetItemColor(#TREE2,CountGadgetItems(#TREE2)-1,#PB_Gadget_BackColor,color_exsists1)
          SIM2 + 1
        Else
          SetGadgetItemColor(#TREE2,CountGadgetItems(#TREE2)-1,#PB_Gadget_BackColor,color_exsists0)
          DIF2 + 1
        EndIf
      Next
  EndSelect
  SetGadgetText(#TEXT_TREE2,"#SIMILAR="+Str(SIM2)+" | #DIFFERENT="+Str(DIF2))
EndProcedure

Procedure resizeStuff()
  WW = WindowWidth(#CHECKSUM)
  WW_H = WW/2
  WH = WindowHeight(#CHECKSUM)
  ResizeGadget(#STRING_PATH1,0,5,WW_H,20)
  ResizeGadget(#STRING_PATH2,WW_H,5,WW_H,20)
  ResizeGadget(#TREE1,0,30,WW_H,WH-90)
  ResizeGadget(#TREE2,WW_H,30,WW_H,WH-90)
  
  ResizeGadget(#TEXT_TREE1,0,GadgetY(#TREE1)+GadgetHeight(#TREE1),WW_H,30)
  ResizeGadget(#TEXT_TREE2,WW_H,GadgetY(#TREE2)+GadgetHeight(#TREE2),WW_H,30)
  
  ResizeGadget(#BUTTON_RESET,WW_H-75-160,WH-35,150,30)
  ResizeGadget(#BUTTON_GENERATEREPORT,WW_H+85,WH-35,150,30)
  ResizeGadget(#BUTTON_IGNOREEXT,WW_H-75,WH-35,150,30)
  
  SetGadgetText(#TEXT_TREE1,"#SIMILAR="+Str(SIM1)+" | #DIFFERENT="+Str(DIF1))
  SetGadgetText(#TEXT_TREE2,"#SIMILAR="+Str(SIM2)+" | #DIFFERENT="+Str(DIF2))
EndProcedure

Procedure switchView(mode.l)
  HideGadget(#STRING_PATH1,mode)
  HideGadget(#STRING_PATH2,mode)
  HideGadget(#TREE1,mode)
  HideGadget(#TREE2,mode)
  HideGadget(#BUTTON_GENERATEREPORT,mode)
  HideGadget(#BUTTON_RESET,mode)
  HideGadget(#BUTTON_IGNOREEXT,mode)
  HideGadget(#TEXT_TREE1,mode)
  HideGadget(#TEXT_TREE2,mode)
  Select mode
    Case 1 : HideGadget(#TEXT_MESSAGE,0)
    Case 0 : HideGadget(#TEXT_MESSAGE,1)
  EndSelect
EndProcedure

Procedure compareDiff()
  Select GetGadgetState(#BUTTON_IGNOREEXT)
    Case 0
      ForEach path1Stuff()
        FOUND = 0
        ForEach path2Stuff()
          If path1Stuff()\path+path1Stuff()\name = path2Stuff()\path+path2Stuff()\name
            FOUND = 1
          EndIf
        Next
        path1Stuff()\exsists = FOUND
      Next
      
      ForEach path2Stuff()
        FOUND = 0
        ForEach path1Stuff()
          If path1Stuff()\path+path1Stuff()\name = path2Stuff()\path+path2Stuff()\name
            FOUND = 1
          EndIf
        Next
        path2Stuff()\exsists = FOUND
      Next
    Case 1
      ForEach path1Stuff()
        FOUND = 0
        ForEach path2Stuff()
          If path1Stuff()\path+path1Stuff()\nameNoExt = path2Stuff()\path+path2Stuff()\nameNoExt
            FOUND = 1
          EndIf
        Next
        path1Stuff()\exsists = FOUND
      Next
      
      ForEach path2Stuff()
        FOUND = 0
        ForEach path1Stuff()
          If path1Stuff()\path+path1Stuff()\nameNoExt = path2Stuff()\path+path2Stuff()\nameNoExt
            FOUND = 1
          EndIf
        Next
        path2Stuff()\exsists = FOUND
      Next
  EndSelect
EndProcedure

Procedure open_report()
  
  If OpenWindow(#REPORT,0,0,230,330,"Compare Files - Report",#PB_Window_WindowCentered|#PB_Window_SystemMenu)
    If CreateGadgetList(WindowID(#REPORT))
      Frame3DGadget(#REPORT_FRAME,10,10,210,310,"Generate Report")
      
      CheckBoxGadget(#REPORT_BOX_PATH1ALSO,20,30,210,30,"Stuff in path1 that is ALSO in path2")
      CheckBoxGadget(#REPORT_BOX_PATH1NOT,20,60,210,30,"Stuff in path1 that is NOT in path2")
      CheckBoxGadget(#REPORT_BOX_PATH2ALSO,20,90,210,30,"Stuff in path2 that is ALSO in path1")
      CheckBoxGadget(#REPORT_BOX_PATH2NOT,20,120,210,30,"Stuff in path2 that is NOT in path1")
      CheckBoxGadget(#REPORT_BOX_ITEMCOUNTS,20,180,210,30,"Item counts")
      CheckBoxGadget(#REPORT_BOX_FULLLIST1,20,210,210,30,"Full list of stuff in path1")
      CheckBoxGadget(#REPORT_BOX_FULLLIST2,20,240,210,30,"Full list of stuff in path2")
      
      SetGadgetState(#REPORT_BOX_PATH1ALSO,1)
      SetGadgetState(#REPORT_BOX_PATH1NOT,1)
      SetGadgetState(#REPORT_BOX_PATH2ALSO,1)
      SetGadgetState(#REPORT_BOX_PATH2NOT,1)
      SetGadgetState(#REPORT_BOX_ITEMCOUNTS,1)
      SetGadgetState(#REPORT_BOX_FULLLIST1,1)
      SetGadgetState(#REPORT_BOX_FULLLIST2,1)
      
      ButtonGadget(#REPORT_BUTTON_SAVE,20,280,190,30,"Save Report")
      
      ENDREPORT = 0
      Repeat
        WEvent = WindowEvent()
        If WEvent
          Select WEvent
            Case #PB_Event_CloseWindow
              If EventWindow() = #CHECKSUM : ENDCHECKSUM = 1 : ENDREPORT = 1
              ElseIf EventWindow() = #REPORT : ENDREPORT = 1
              EndIf
            Case #PB_Event_Gadget
              Select EventGadget()
                Case #REPORT_BUTTON_SAVE
                  fileToSave.s = SaveFileRequester("Save file where?","","Text (*.txt)|*.txt",0)
                  If fileToSave <> ""
                    If UCase(Mid(fileToSave,Len(fileToSave)-3,4)) <> ".TXT" : fileToSave + ".TXT" : EndIf
                    fullPath = MessageRequester("Compare Files","Do you want to include the full path?",#PB_MessageRequester_YesNo)
                    If CreateFile(#REPORTFILE,fileToSave)
                      
                      WriteStringN(#REPORTFILE,"Path1:"+path1)
                      WriteStringN(#REPORTFILE,"Path2:"+path2)
                      If GetGadgetState(#BUTTON_IGNOREEXT) = 1
                        WriteStringN(#REPORTFILE,"Extensions are ignored")
                      EndIf
                      
                      If GetGadgetState(#REPORT_BOX_PATH1ALSO) = 1
                        WriteStringN(#REPORTFILE,"")
                        WriteStringN(#REPORTFILE,"")
                        WriteStringN(#REPORTFILE,"-----------------------------------------------------")
                        WriteStringN(#REPORTFILE,"Contents of path1 that are ALSO in path2")
                        WriteStringN(#REPORTFILE,"-----------------------------------------------------")
                        ForEach path1Stuff()
                          If path1Stuff()\exsists = 1
                            If fullPath = #PB_MessageRequester_Yes
                              WriteStringN(#REPORTFILE,path1+path1Stuff()\path+path1Stuff()\name)
                            Else
                              WriteStringN(#REPORTFILE,path1Stuff()\path+path1Stuff()\name)
                            EndIf
                          EndIf
                        Next
                      EndIf
                      
                      If GetGadgetState(#REPORT_BOX_PATH1NOT) = 1
                        WriteStringN(#REPORTFILE,"")
                        WriteStringN(#REPORTFILE,"")
                        WriteStringN(#REPORTFILE,"-----------------------------------------------------")
                        WriteStringN(#REPORTFILE,"Contents of path1 that are NOT in path2")
                        WriteStringN(#REPORTFILE,"-----------------------------------------------------")
                        ForEach path1Stuff()
                          If path1Stuff()\exsists = 0
                            If fullPath = #PB_MessageRequester_Yes
                              WriteStringN(#REPORTFILE,path1+path1Stuff()\path+path1Stuff()\name)
                            Else
                              WriteStringN(#REPORTFILE,path1Stuff()\path+path1Stuff()\name)
                            EndIf
                          EndIf
                        Next
                      EndIf
                      
                      If GetGadgetState(#REPORT_BOX_PATH2ALSO) = 1
                        WriteStringN(#REPORTFILE,"")
                        WriteStringN(#REPORTFILE,"")
                        WriteStringN(#REPORTFILE,"-----------------------------------------------------")
                        WriteStringN(#REPORTFILE,"Contents of path2 that are ALSO in path1")
                        WriteStringN(#REPORTFILE,"-----------------------------------------------------")
                        ForEach path2Stuff()
                          If path2Stuff()\exsists = 1
                            If fullPath = #PB_MessageRequester_Yes
                              WriteStringN(#REPORTFILE,path2+path2Stuff()\path+path2Stuff()\name)
                            Else
                              WriteStringN(#REPORTFILE,path2Stuff()\path+path2Stuff()\name)
                            EndIf
                          EndIf
                        Next
                      EndIf
                      
                      If GetGadgetState(#REPORT_BOX_PATH2NOT) = 1
                        WriteStringN(#REPORTFILE,"")
                        WriteStringN(#REPORTFILE,"")
                        WriteStringN(#REPORTFILE,"-----------------------------------------------------")
                        WriteStringN(#REPORTFILE,"Contents of path2 that are NOT in path1")
                        WriteStringN(#REPORTFILE,"-----------------------------------------------------")
                        ForEach path2Stuff()
                          If path2Stuff()\exsists = 0
                            If fullPath = #PB_MessageRequester_Yes
                              WriteStringN(#REPORTFILE,path2+path2Stuff()\path+path2Stuff()\name)
                            Else
                              WriteStringN(#REPORTFILE,path2Stuff()\path+path2Stuff()\name)
                            EndIf
                          EndIf
                        Next
                      EndIf
                      
                      If GetGadgetState(#REPORT_BOX_ITEMCOUNTS) = 1
                        WriteStringN(#REPORTFILE,"")
                        WriteStringN(#REPORTFILE,"")
                        WriteStringN(#REPORTFILE,"-----------------------------------------------------")
                        WriteStringN(#REPORTFILE,"Item Counts")
                        WriteStringN(#REPORTFILE,"-----------------------------------------------------")
                        Focnt = 0
                        Ficnt = 0
                        ForEach path1Stuff()
                          If path1Stuff()\fof = #PB_DirectoryEntry_Directory : Focnt + 1
                          Else : Ficnt + 1
                          EndIf
                        Next
                        WriteStringN(#REPORTFILE,"Total # of folders in path1: "+Str(Focnt))
                        WriteStringN(#REPORTFILE,"Total # of files in path1: "+Str(Ficnt))
                        Focnt = 0
                        Ficnt = 0
                        ForEach path2Stuff()
                          If path2Stuff()\fof = #PB_DirectoryEntry_Directory : Focnt + 1
                          Else : Ficnt + 1
                          EndIf
                        Next
                        WriteStringN(#REPORTFILE,"Total # of folders in path2: "+Str(Focnt))
                        WriteStringN(#REPORTFILE,"Total # of files in path2: "+Str(Ficnt))
                        WriteStringN(#REPORTFILE,"Total # of items in path1 that are in path2: "+Str(SIM1))
                        WriteStringN(#REPORTFILE,"Total # of items in path1 that are NOT in path2: "+Str(DIF1))
                        WriteStringN(#REPORTFILE,"Total # of items in path2 that are in path1: "+Str(SIM2))
                        WriteStringN(#REPORTFILE,"Total # of items in path2 that are NOT in path1: "+Str(DIF2))
                      EndIf
                      
                      If GetGadgetState(#REPORT_BOX_FULLLIST1) = 1
                        WriteStringN(#REPORTFILE,"")
                        WriteStringN(#REPORTFILE,"")
                        WriteStringN(#REPORTFILE,"-----------------------------------------------------")
                        WriteStringN(#REPORTFILE,"Path 1 Contents")
                        WriteStringN(#REPORTFILE,"-----------------------------------------------------")
                        ForEach path1Stuff()
                          If fullPath = #PB_MessageRequester_Yes
                            WriteStringN(#REPORTFILE,path1+path1Stuff()\path+path1Stuff()\name)
                          Else
                            WriteStringN(#REPORTFILE,path1Stuff()\path+path1Stuff()\name)
                          EndIf
                        Next
                      EndIf
                      
                      If GetGadgetState(#REPORT_BOX_FULLLIST2) = 1
                        WriteStringN(#REPORTFILE,"")
                        WriteStringN(#REPORTFILE,"")
                        WriteStringN(#REPORTFILE,"-----------------------------------------------------")
                        WriteStringN(#REPORTFILE,"Path 2 Contents")
                        WriteStringN(#REPORTFILE,"-----------------------------------------------------")
                        ForEach path2Stuff()
                          If fullPath = #PB_MessageRequester_Yes
                            WriteStringN(#REPORTFILE,path2+path2Stuff()\path+path2Stuff()\name)
                          Else
                            WriteStringN(#REPORTFILE,path2Stuff()\path+path2Stuff()\name)
                          EndIf
                        Next
                      EndIf
                      
                      CloseFile(#REPORTFILE)
                      MessageRequester("Compare Files","Saved!")
                    Else : ERROR("Could not create "+fileToSave)
                    EndIf
                  EndIf
              EndSelect
          EndSelect
        EndIf
      Until ENDREPORT <> 0
      CloseWindow(#REPORT)
    EndIf
  EndIf
EndProcedure

;-open_main
If OpenWindow(#CHECKSUM,100,100,800,600,"Compare Files by Matt",#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(#CHECKSUM))

    StringGadget(#STRING_PATH1,110,5,580,20,"Click here to set path 1",#PB_String_ReadOnly)
    StringGadget(#STRING_PATH2,110,35,580,20,"Click here to set path 2",#PB_String_ReadOnly)
    
    TextGadget(#TEXT_MESSAGE,5,5,1000,20,"Working...") : HideGadget(#TEXT_MESSAGE,1)
    
    TextGadget(#TEXT_TREE1,0,0,0,0,"#SIMILAR=0 | #DIFFERENT=0",#PB_Text_Center)
    TextGadget(#TEXT_TREE2,0,0,0,0,"#SIMILAR=0 | #DIFFERENT=0",#PB_Text_Center)
    
    ButtonGadget(#BUTTON_GENERATEREPORT,485,510,150,30,"Generate Report",#PB_Button_Default)
    ButtonGadget(#BUTTON_RESET,485,510,150,30,"Reset")
    ButtonGadget(#BUTTON_IGNOREEXT,0,0,0,0,"Ignore Extension",#PB_Button_Toggle)

    TreeGadget(#TREE1,0,30,400,400)
    TreeGadget(#TREE2,400,30,400,400)
    
    resizeStuff()
    
    ENDCHECKSUM = 0
    Repeat
      WEvent = WindowEvent()
      Select WEvent
        Case #PB_Event_CloseWindow
          If EventWindow() = #CHECKSUM : ENDCHECKSUM = 1
          ElseIf EventWindow() = #REPORT : ENDREPORT = 1
          EndIf
        Case #PB_Event_SizeWindow : resizeStuff()
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #BUTTON_IGNOREEXT
              switchView(1)
              compareDiff()
              refreshPath1Stuff()
              refreshPath2Stuff()
              switchView(0)
              
            Case #BUTTON_GENERATEREPORT
              If CountList(path1Stuff()) = 0 And CountList(path2Stuff()) = 0 
                ERROR("Nothing to report.")
              Else
                switchView(1)
                SetGadgetText(#TEXT_MESSAGE,"Generating Report...")
                open_report()
                switchView(0)
              EndIf
          
            Case #BUTTON_RESET
              SetGadgetText(#STRING_PATH1,"Click here to set path 1")
              SetGadgetText(#STRING_PATH2,"Click here to set path 2")
              SetGadgetText(#TEXT_TREE1,"#SIMILAR=0 | #DIFFERENT=0")
              SetGadgetText(#TEXT_TREE2,"#SIMILAR=0 | #DIFFERENT=0")
              ClearGadgetItemList(#TREE1)
              ClearGadgetItemList(#TREE2)
              ClearList(path1Stuff())
              ClearList(path2Stuff())
              SIM1 = 0
              SIM2 = 0
              DIF1 = 0
              DIF2 = 0
              path1 = ""
              path2 = ""
          
            Case #STRING_PATH1
              If EventType() = #PB_EventType_Focus
                pathToTry.s = Trim(InputRequester("Compare Files","Enter Path 1, or leave blank to browse for path.",""))
                If pathToTry = ""
                  pathToTry = PathRequester("Choose Path 1",GetGadgetText(#STRING_PATH1))
                EndIf
                If pathToTry <> ""
                  If ExamineDirectory(#DIR,pathToTry,"")
                    If Mid(pathToTry,Len(pathToTry),1) <> "\" : pathToTry + "\" : EndIf
                    SetGadgetText(#STRING_PATH1,pathToTry)
                    FinishDirectory(#DIR)
                    switchView(1)
                    ClearList(path1Stuff())
                    findAndAddPath1(0,"")
                    If CountList(path2Stuff()) > 0
                      compareDiff()
                      refreshPath2Stuff()
                    EndIf
                    switchView(0)
                    refreshPath1Stuff()
                  Else : error(pathToTry+" is not a valid path.")
                  EndIf
                EndIf
              EndIf
            
            Case #STRING_PATH2
              If EventType() = #PB_EventType_Focus
                pathToTry.s = Trim(InputRequester("Compare Files","Enter Path 2, or leave blank to browse for path.",""))
                If pathToTry = ""
                  pathToTry = PathRequester("Choose Path 2",GetGadgetText(#STRING_PATH2))
                EndIf
                If pathToTry <> ""
                  If ExamineDirectory(#DIR,pathToTry,"")
                    If Mid(pathToTry,Len(pathToTry),1) <> "\" : pathToTry + "\" : EndIf
                    SetGadgetText(#STRING_PATH2,pathToTry)
                    FinishDirectory(#DIR)
                    switchView(1)
                    ClearList(path2Stuff())
                    findAndAddPath2(0,"")
                    If CountList(path1Stuff()) > 0
                      compareDiff()
                      refreshPath1Stuff()
                    EndIf
                    switchView(0)
                    refreshPath2Stuff()
                  Else : error(pathToTry+" is not a valid path.")
                  EndIf
                EndIf
              EndIf
            
          EndSelect
      EndSelect
    Until ENDCHECKSUM <> 0
  
  EndIf
  CloseWindow(#CHECKSUM)
EndIf
I used this code btw for the icons so I didnt have to upload anything. Takes an image file and creates a text file with pb code to include so you dont need to load images externally or cache them in the exe

Code: Select all

Procedure error(message.s) : MessageRequester("ERROR",message) : EndProcedure
UseJPEGImageDecoder()
UseTGAImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()

Structure dots
  x.l
  y.l
  color.l
EndStructure
Global NewList dot.dots()

fileToConvert.s = OpenFileRequester("Select an image file to convert to purebasic code.","","",0)
If fileToConvert <> ""
  If LoadImage(0,fileToConvert)
    fileToSave.s = SaveFileRequester("Choose output file.","","",0)
    If CreateFile(0,fileToSave)
      StartDrawing(ImageOutput(0))
        For x = 0 To ImageWidth(0)-1
          For y = 0 To ImageHeight(0)-1
            AddElement(dot())
            dot()\x = x
            dot()\y = y
            dot()\color = Point(x,y)
          Next y
        Next x
      StopDrawing()
      
      WriteStringN(0,"CreateImage(#IMAGE,"+Str(ImageWidth(0))+","+Str(ImageHeight(0))+")")
      WriteStringN(0,"StartDrawing(ImageOutput(#IMAGE))")
      ForEach dot()
        WriteStringN(0,"  Box("+Str(dot()\x)+","+Str(dot()\y)+",1,1,RGB("+Str(Red(dot()\color))+","+Str(Green(dot()\color))+","+Str(Blue(dot()\color))+"))")
      Next
      WriteStringN(0,"StopDrawing()")
      MessageRequester("DONE!","DONE!")
    Else : Error("Could not create "+fileToSave)
    EndIf
  Else : Error("Could not load "+fileToConvert+" as image.")
  EndIf
EndIf
EDIT 09-23-2011 - Fixed a few bugs and added "Ignore Extension" button.

Re: Simple Folder Compare App

Posted: Wed Sep 21, 2011 6:24 pm
by IdeasVacuum
Both very impressive utils, thanks for sharing. 8)

Re: Simple Folder Compare App

Posted: Wed Sep 21, 2011 11:44 pm
by em_uk
What version of PB are you using? A lot of depreciated functions in your code, while harmless my OCD is pinging.

You may also want to move some procedures into threads.

Re: Simple Folder Compare App

Posted: Thu Sep 22, 2011 1:50 am
by Demivec
Here is a much faster version of your compareDiff() procedure:

Code: Select all

Procedure compareDiff()
  Protected NewMap *comp.dirStuff()
  ForEach path1Stuff()
    *comp(path1Stuff()\Path + path1Stuff()\name) = @path1Stuff()
  Next
   
  ForEach path2Stuff()
    If FindMapElement(*comp(), path2Stuff()\Path + path2Stuff()\name)
      path2Stuff()\exsists = 1 ;love the spelling ;)
      *comp()\exsists = 1
    EndIf
  Next 
EndProcedure

Re: Simple Folder Compare App

Posted: Thu Sep 22, 2011 2:35 pm
by treebolt
em_uk wrote:What version of PB are you using? A lot of depreciated functions in your code, while harmless my OCD is pinging.

You may also want to move some procedures into threads.
Using PB 4.1, I've been using PB since 2002, stopped for a while but I'm getting back into it now. It's been most helpful in my new career. Long live PB!! :mrgreen:
Demivec wrote:Here is a much faster version of your compareDiff() procedure:

Code: Select all

Procedure compareDiff()
Protected NewMap *comp.dirStuff()
ForEach path1Stuff()
*comp(path1Stuff()\Path + path1Stuff()\name) = @path1Stuff()
Next

ForEach path2Stuff()
If FindMapElement(*comp(), path2Stuff()\Path + path2Stuff()\name)
path2Stuff()\exsists = 1 ;love the spelling ;)
*comp()\exsists = 1
EndIf
Next 
EndProcedure
Very cool, Thanks! My version of PB doesn't support it though =( Guess it's time to update and learn.