Ray Camden's Friday Puzzler - Compare Directories

Posted December 7, 2007 at 11:34 AM by Ben Nadel

Tags: ColdFusion

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:


 
 
 

 
Directory Compare Using ColdFusion Query of Queries  
 
 
 

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

Dec 7, 2007 at 4:41 PM // reply »
153 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


Dec 7, 2007 at 9:37 PM // reply »
6 Comments

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.


Dec 10, 2007 at 8:01 AM // reply »
11,238 Comments

@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.


Mar 21, 2008 at 12:18 PM // reply »
7 Comments

Thanks for the article, I was seeking it.


Mar 27, 2008 at 11:50 AM // reply »
1 Comments

"So you can find the information on it on my search resource
http://fileshunt.com"


Post A Comment

Comment Etiquette: Please do not post spam. Please keep the comments on-topic. Please do not post unrelated questions or large chunks of code. And, above all, please be nice to each other - we're trying to have a good conversation here.

Please review the following issues:

Author Name:


Author Email:

Author Website:

Comment:

Supported HTML tags for formatting: <strong>bold</strong>   <em>italic</em>   <code>code</code>







  • Help Wanted - Find Your Next ColdFusion Job
Ben Nadel's Company - Epicenter Consulting Recent Blog Comments
May 21, 2013 at 9:25 AM
Turning Off and On Identity Column in SQL Server
you are awesome..i am lucky to get this blog between such a garbage one....Thanks, Prashant ... read »
May 20, 2013 at 4:38 PM
Using A Dynamic Column Name With ValueList() In ColdFusion
@Dana, Your confusion is well founded, since this is a very confusing features. In fact, it ONLY works if you use array notation. Meaning, that this: arrayToList( query[ "columnName" ] ) ... read »
May 20, 2013 at 4:34 PM
Using A Dynamic Column Name With ValueList() In ColdFusion
I was thinking chicken and the egg, I wouldn't have expected it to work in the valuelist going in I guess. Maybe I just need a beer, long day :) ... read »
May 20, 2013 at 4:29 PM
Using A Dynamic Column Name With ValueList() In ColdFusion
@Dana, That's if you're trying to reference a specific row. In this case, we're trying to reference the entire query column as one cohesive value. So, you are correct that if you wanted to output a ... read »
May 20, 2013 at 4:24 PM
Using A Dynamic Column Name With ValueList() In ColdFusion
I thought when you used array notation to reference queries you always had to have the row or it would throw a similar error as well? ... read »
May 20, 2013 at 11:45 AM
Using jQuery's Animate() Step Callback Function To Create Custom Animations
This is really useful. I found out that you don't actually have to use a dummy css property (surprisingly). To animate a property in a linear-gradient for instance I did this this.css('someLinearGra ... read »
May 20, 2013 at 10:51 AM
Using A Dynamic Column Name With ValueList() In ColdFusion
@Josh, Oh snap! You're totally right! I'm not sure I've ever tried that. I did know that you can call a number of other array-methods on ColdFusion query columns: http://www.bennadel.com/blog/167 ... read »
May 20, 2013 at 10:45 AM
Using A Dynamic Column Name With ValueList() In ColdFusion
@Ben - I believe you can achieve the same functionality with ColdFusion's built in ArrayToList() function. ArrayToList( users[ "id" ] ); ... read »
InVision App - Prototyping Made Beautiful With Prototyping Tools