Ray Camden's Friday Puzzler - Compare Directories
Posted December 7, 2007 at 11:34 AM by Ben Nadel
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.
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"




