Ray Camden's Friday Puzzler - Compare Directories
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:
Directory A:
- \A\20071207.txt
- \A\a-only.txt
- \A\duplicate_file.txt
Directory B:
- \B\20071207.txt
- \B\b-only.txt
- \B\duplicate_file.txt
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.
Reader Comments
My solution also used QoQ, but differently:
http://www.coldfusionjedi.com/index.cfm/2007/12/7/Friday-Challenge--Compare-Directories#cB5E79338-19B9-E658-9D3917D4071BDB2D
-R
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 :(
Here is a link to my original idea:
http://www.mediafire.com/?6yttt3x1kdt (download)
http://snippets.dzone.com/posts/show/4864 (view online)
Any thoughts on my solution would be appreciated.
@Rick,
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
http://fileshunt.com"