CompareDirectories – Find different files in two directories

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 differentEnd 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:BACKUPDOCS'   Dim arr() As Variant, index As Long'   arr = CompareDirectories("C:DOCS", "C:BACKUPDOCS")'   ' 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)'   NextFunction 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 IfEnd Function

Share the Post:
Share on facebook
Share on twitter
Share on linkedin

Overview

Recent Articles: