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"