Atlanta Custom Software Development 

 
   Search        Code/Page
 

User Login
Email

Password

 

Forgot the Password?
Services
» Web Development
» Maintenance
» Data Integration/BI
» Information Management
Programming
  Database
Automation
OS/Networking
Graphics
Links
Tools
» Regular Expr Tester
» Free Tools

CompareDirectories - Find different files in two directories

Total Hit ( 3032)

Rate this article:     Poor     Excellent 

 Submit Your Question/Comment about this article

Rating


 



Click here to copy the following block
Enum CompareDirectoryEnum
  cdeSourceDirOnly = -2  ' file is present only in the source directory
  cdeDestDirOnly = -1   ' file is present only in the dest directory
  cdeEqual = 0      ' file is present in both directories,
              ' with same date, size, and attributes
  cdeSourceIsNewer = 1  ' file in source dir is newer
  cdeSourceIsOlder = 2  ' file in source dir is older
  cdeDateDiffer = 3    ' date of files are different
  cdeSizeDiffer = 4    ' size of files are different
  cdeAttributesDiffer = 8 ' attributes of files are different
End Enum

' Compare files in two directories
'
' returns a two-dimensional array of variants, where arr(0,
' n) is the name of the N-th file
' and arr(1, n) is one of the CompareDirectoryEnum values
'
' NOTE: requires a reference to the Microsoft Scripting Runtime type library
'
' Usage example:
'  ' compare the directories C:\DOCS and C:\BACKUP\DOCS
'  Dim arr() As Variant, index As Long
'  arr = CompareDirectories("C:\DOCS", "C:\BACKUP\DOCS")
'  ' display files in C:\DOCS that should be copied into the backup directory
'  ' because they are newer or because they aren't there
'  For index = 1 To UBound(arr, 2)
'    If arr(1, index) = cdeSourceDirOnly Or arr(1, index) = cdeSourceIsNewer
' Then
'      Print arr(0, index)
'  Next

Function CompareDirectories(ByVal sourceDir As String, ByVal destDir As String) _
  As Variant()
  Dim fso As New Scripting.FileSystemObject
  Dim sourceFld As Scripting.Folder
  Dim destFld As Scripting.Folder
  Dim sourceFile As Scripting.File
  Dim destFile As Scripting.File
  Dim col As New Collection
  Dim index As Long
  Dim FileName As String
  
  ' get a reference to source and dest folders
  Set sourceFld = fso.GetFolder(sourceDir)
  Set destFld = fso.GetFolder(destDir)
  
  ' ensure that destination path has a trailing backslash
  If Right$(destDir, 1) <> "\" Then destDir = destDir & "\"
  
  ' prepare result array - make it large enough
  ' (we will shrink it later)
  ReDim res(1, sourceFld.Files.Count + destFld.Files.Count) As Variant
  
  ' we need to ignore errors, in case file doesn't exist in destination dir
  On Error Resume Next
  
  ' load files of source directory into result array
  For Each sourceFile In sourceFld.Files
    ' this is the name of the file
    FileName = sourceFile.Name
    
    ' add file name to array
    index = index + 1
    res(0, index) = FileName
    
    ' add file name to collection (to be used later)
    col.Add FileName, FileName
    
    ' try to get a reference to destination file
    Set destFile = fso.GetFile(destDir & FileName)
    
    If Err Then
      Err.Clear
      ' file exists only in source directory
      res(1, index) = cdeSourceDirOnly
      
    Else
      ' if the file exists in both directories,
      ' start assuming it's the same file
      res(1, index) = cdeEqual
      
      ' compare file dates
      Select Case DateDiff("s", sourceFile.DateLastModified, _
        destFile.DateLastModified)
        Case Is < 0
          ' source file is newer
          res(1, index) = cdeSourceIsNewer
        Case Is > 0
          ' source file is newer
          res(1, index) = cdeSourceIsOlder
      End Select
      
      ' compare attributes
      If sourceFile.Attributes <> destFile.Attributes Then
        res(1, index) = res(1, index) Or cdeAttributesDiffer
      End If
      
      ' compare size
      If sourceFile.Size <> destFile.Size Then
        res(1, index) = res(1, index) Or cdeSizeDiffer
      End If
    End If
  Next
  
  ' now we only need to add all the files in destination directory
  ' that don't appear in the source directory
  For Each destFile In destFld.Files
    ' it's faster to search in the collection
    If col(destFile.Name) = "" Then
      ' we get here only if the filename isn't in the collection
      ' add the file to the result array
      index = index + 1
      res(0, index) = destFile.Name
      ' remember this only appears in the destination directory
      res(1, index) = cdeDestDirOnly
    End If
  Next
  
  ' trim and return the result
  If index > 0 Then
    ReDim Preserve res(1, index) As Variant
    CompareDirectories = res
  End If

End Function


Submitted By : Nayan Patel  (Member Since : 5/26/2004 12:23:06 PM)

Job Description : He is the moderator of this site and currently working as an independent consultant. He works with VB.net/ASP.net, SQL Server and other MS technologies. He is MCSD.net, MCDBA and MCSE. In his free time he likes to watch funny movies and doing oil painting.
View all (893) submissions by this author  (Birth Date : 7/14/1981 )


Home   |  Comment   |  Contact Us   |  Privacy Policy   |  Terms & Conditions   |  BlogsZappySys

© 2008 BinaryWorld LLC. All rights reserved.