Ray Camden put up a Friday Puzzler to compare directories. This felt like a place to quickly throw some ColdFusion query of queries together. This solution will work with small directories, but certainly, I doubt that this will scale nicely as it would end up generating ENORMOUSLY SQL statements.
To start off with, I created two small directories:
Each directory has a file that is unique to them (a-only.txt and b-only.txt). Each on has a duplicate file (duplicate_file.txt). And, each on of them has a duplicate file that is a different size (20071207.txt). To compare these two directories from the directory, I ran this code:
<!--- Query files from directory A. ---> <cfdirectory action="list" directory="#ExpandPath( './A/' )#" name="qA" /> <!--- Query files from directory B. ---> <cfdirectory action="list" directory="#ExpandPath( './B/' )#" name="qB" /> <!--- Query for files that are in A, but not in B. ---> <cfquery name="qAOnly" dbtype="query"> SELECT [name] FROM qA WHERE [type] = 'File' AND ( 1 = 1 <!--- Make sure the current A record does NOT match any records in the B query. ---> <cfloop query="qB"> AND [name] != '#qB.name#' </cfloop> ) </cfquery> <!--- Query for files that are in B, but not in B. ---> <cfquery name="qBOnly" dbtype="query"> SELECT [name] FROM qB WHERE [type] = 'File' AND ( 1 = 1 <!--- Make sure the current B record does NOT match any records in the A query. ---> <cfloop query="qA"> AND [name] != '#qA.name#' </cfloop> ) </cfquery> <!--- Query for files that are both in A and B, but not on the same date or size. ---> <cfquery name="qBoth" dbtype="query"> SELECT qA.[name] FROM qA, qB WHERE qA.[type] = 'File' AND qA.[name] = qB.[name] AND ( qA.datelastmodified != qB.datelastmodified OR qA.size != qB.size ) </cfquery> <!--- Dump out results. ---> <cfdump var="#qAOnly#" label="Directory A Only" /> <br /> <cfdump var="#qBOnly#" label="Directory B Only" /> <br /> <cfdump var="#qBoth#" label="Both But Different" />
When we run that, we get this CFDump output:
So, it works for small little directory compares. I know anything about File Diffs or Directory Diffs, so I am sure that there are way more optimized ways of doing this. But, ColdFusion query of queries makes this a rather easy task.
Want to use code from this post? Check out the license.
My solution also used QoQ, but differently:
Interesting approach. I requested the challenge since I have to write a script to see if previous people were doing their development on the development server or the production server :(
Any thoughts on my solution would be appreciated.
Your solution is very good. My hat is off to you, good sir. It's nice to see someone who really knows how to leverage ColdFusion query of queries. Sometimes I think they are one of the unsung heroes of ColdFusion.
Thanks for the article, I was seeking it.
"So you can find the information on it on my search resource