Directory Compare
1. What files exist in folder A, but not B.
2. What files exist in folder B, but not A.
3. What files exist in both, but appear different.
1 2 <cfsetting requesttimeout="9999"> 3 4 <cfparam name="FORM.DevelopmentDirectory" default="/kkkkkk/lllll/bbbb/ccc"> 5 <cfparam name="FORM.ProductionDirectory" default="/mmmmmm/ggggg/bbbb/ccc"> 6 <cfparam name="FORM.CommonDirectory" default="/ccc"> 7 8 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 9 <html xmlns="http://www.w3.org/1999/xhtml"> 10 <head> 11 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 12 <title>Directory Compare</title> 13 </head> 14 15 <body> 16 17 <h3>Directory Compare</h3> 18 <form name="directoryCompare" action="index.cfm" method="post"> 19 <table> 20 <tr> 21 <td>Development Directory</td> 22 <td><input name="DevelopmentDirectory" id="DevelopmentDirectory" type="text" value="<cfoutput>#FORM.DevelopmentDirectory#</cfoutput>" size="70"></td> 23 </tr> 24 <tr> 25 <td>Production Directory</td> 26 <td><input name="ProductionDirectory" id="ProductionDirectory" type="text" value="<cfoutput>#FORM.ProductionDirectory#</cfoutput>" size="70"></td> 27 </tr> 28 <tr> 29 <td>Common Directory</td> 30 <td><input name="CommonDirectory" id="CommonDirectory" type="text" value="<cfoutput>#FORM.CommonDirectory#</cfoutput>" size="40"></td> 31 </tr> 32 <tr> 33 <td> </td> 34 <td><input type="submit" name="submit" value="submit"></td> 35 </tr> 36 </table> 37 </form> 38 39 <cfif isdefined('FORM.submit')> 40 41 <cfdirectory action="list" directory="#FORM.ProductionDirectory#" name="prodDir" recurse="yes"> 42 <!--- <cfdump var="#prodDir#"> ---> 43 <cfdirectory action="list" directory="#FORM.DevelopmentDirectory#" name="devDir" recurse="yes"> 44 <!--- <cfdump var="#devDir#"> ---> 45 46 47 <!--- Need common directory base to compare ---> 48 <cfset dev_strip = Mid(FORM.DevelopmentDirectory,1,FindNoCase(FORM.CommonDirectory,FORM.DevelopmentDirectory))> 49 <cfset prod_strip = Mid(FORM.ProductionDirectory,1,FindNoCase(FORM.CommonDirectory,FORM.ProductionDirectory))> 50 51 52 <!--- o = Output Container ---> 53 <cfset o = StructNew()> 54 <cfset o.keys = ArrayNew(1)> 55 56 57 <cfloop query="prodDir"> 58 59 <!--- Put array string in the order that will sort correctly ---> 60 <cfset L = prodDir.TYPE & "|" & ReplaceNoCase(prodDir.DIRECTORY,prod_strip,"","all") & "/" & prodDir.NAME > 61 <!--- Turn the type/dir/name into something that makes a valid variable name ---> 62 <cfset k = "K" & cfusion_encrypt(L,"key")> 63 64 <!--- Have we encountered this entry before? ---> 65 <!--- This also filters duplicates between the two queries. ---> 66 <cfif not StructKeyExists(o,k)> 67 <!--- Add to list of valid values ---> 68 <cfset ArrayAppend(o.keys,L & "|" & k)> 69 <cfset o[k] = StructNew()> 70 <cfset o[k].prod_path = ""> 71 <cfset o[k].prod_type = ""> 72 <cfset o[k].prod_size = ""> 73 <cfset o[k].dev_path = ""> 74 <cfset o[k].dev_type = ""> 75 <cfset o[k].dev_size = ""> 76 </cfif> 77 78 <cfset o[k].prod_path = prodDir.DIRECTORY & "/" & prodDir.NAME> 79 <cfset o[k].prod_type = prodDir.TYPE> 80 <cfset o[k].prod_size = prodDir.SIZE> 81 82 </cfloop> 83 <!--- <cfdump var="#o#"> ---> 84 85 86 <cfloop query="devDir"> 87 88 <!--- Put array string in the order that will sort correctly ---> 89 <cfset L = devDir.TYPE & "|" & ReplaceNoCase(devDir.DIRECTORY,dev_strip,"","all") & "/" & devDir.NAME > 90 <!--- Turn the type/dir/name into something that makes a valid variable name ---> 91 <cfset k = "K" & cfusion_encrypt(L,"key")> 92 93 <!--- Have we encountered this entry before? ---> 94 <!--- This also filters duplicates between the two queries. ---> 95 <cfif not StructKeyExists(o,k)> 96 <!--- Add to list of valid values ---> 97 <cfset ArrayAppend(o.keys,L & "|" & k)> 98 <cfset o[k] = StructNew()> 99 <cfset o[k].prod_path = ""> 100 <cfset o[k].prod_type = ""> 101 <cfset o[k].prod_size = ""> 102 <cfset o[k].dev_path = ""> 103 <cfset o[k].dev_type = ""> 104 <cfset o[k].dev_size = ""> 105 </cfif> 106 107 <cfset o[k].dev_path = devDir.DIRECTORY & "/" & devDir.NAME> 108 <cfset o[k].dev_type = devDir.TYPE> 109 <cfset o[k].dev_size = devDir.SIZE> 110 111 </cfloop> 112 <!--- <cfdump var="#o#"> ---> 113 114 115 <cfset ArraySort(o.keys,"textnocase","asc")> 116 117 118 <cfoutput> 119 <table cellspacing="0" border="0" cellpadding="3"> 120 <tr> 121 <th>Development</th> 122 <th>Production</th> 123 </tr> 124 <cfloop index="i" from="1" to="#ArrayLen(o.keys)#"> 125 <cfset k = ListLast(o.keys[i],"|")> 126 <tr> 127 <!--- DEV ---> 128 <td style="border-bottom:1px solid ##CCCCCC;"> 129 <cfif o[k].prod_path EQ ""> 130 <!--- On Dev NOT on Prod ---> 131 <span style="color:##0000FF; font-weight:bold;"> 132 <cfelse> 133 <cfif o[k].prod_size NEQ o[k].dev_size> 134 <!--- On Dev and On Prod, but Differnet ---> 135 <span style="color:##FF9900; font-weight:bold;"> 136 <cfelse> 137 <!--- On Dev and On Prod and The Same (probably) ---> 138 <span> 139 </cfif> 140 </cfif> 141 #o[k].dev_path# 142 </span> 143 <cfif o[k].dev_path NEQ ""> 144 <span style="font-size:smaller; color:##999999;">(#o[k].dev_size#)</span> 145 </cfif> 146 </td> 147 <!--- PROD ---> 148 <td style="border-bottom:1px solid ##CCCCCC;"> 149 <cfif o[k].dev_path EQ ""> 150 <!--- On Prod NOT On Dev ---> 151 <span style="color:##FF0000; font-weight:bold;"> 152 <cfelse> 153 <cfif o[k].prod_size NEQ o[k].dev_size> 154 <!--- On Dev and On Prod, but Differnet ---> 155 <span style="color:##FF9900; font-weight:bold;"> 156 <cfelse> 157 <!--- On Dev and On Prod and The Same (probably) ---> 158 <span> 159 </cfif> 160 </cfif> 161 #o[k].prod_path# 162 </span> 163 <cfif o[k].prod_path NEQ ""> 164 <span style="font-size:smaller; color:##999999;">(#o[k].prod_size#)</span> 165 </cfif> 166 </td> 167 </tr> 168 </cfloop> 169 </table> 170 </cfoutput> 171 </cfif> 172 173 </body> 174 </html> 175