VERSION 1.0 CLASS BEGIN MultiUse = -1 'True Persistable = 0 'NotPersistable DataBindingBehavior = 0 'vbNone DataSourceBehavior = 0 'vbNone MTSTransactionMode = 0 'NotAnMTSObject END Attribute VB_Name = "CollectedFiles" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Attribute VB_Exposed = False '************************************************************************* ' ' Licensed to the Apache Software Foundation (ASF) under one ' or more contributor license agreements. See the NOTICE file ' distributed with this work for additional information ' regarding copyright ownership. The ASF licenses this file ' to you under the Apache License, Version 2.0 (the ' "License"); you may not use this file except in compliance ' with the License. You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, ' software distributed under the License is distributed on an ' "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ' KIND, either express or implied. See the License for the ' specific language governing permissions and limitations ' under the License. ' '************************************************************************* Option Explicit Private Const vbDot = 46 Private Const MAX_PATH = 260 Private Const INVALID_HANDLE_VALUE = -1 Private Const vbBackslash = "\" Private Const ALL_FILES = "*.*" Private Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Private Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer wMilliseconds As Integer End Type Private Type WIN32_FIND_DATA dwFileAttributes As Long ftCreationTime As FILETIME ftLastAccessTime As FILETIME ftLastWriteTime As FILETIME nFileSizeHigh As Long nFileSizeLow As Long dwReserved0 As Long dwReserved1 As Long cFileName As String * MAX_PATH cAlternate As String * 14 End Type Private Type FILE_PARAMS bRecurse As Boolean nSearched As Long sFileNameExt As String sFileRoot As String End Type Private Declare Function SystemTimeToFileTime Lib "kernel32" _ (lpSystemTime As SYSTEMTIME, _ lpFileTime As FILETIME) As Long Private Declare Function CompareFileTime Lib "kernel32" _ (lpFileTime1 As FILETIME, _ lpFileTime2 As FILETIME) As Long Private Declare Function FindClose Lib "kernel32" _ (ByVal hFindFile As Long) As Long Private Declare Function FindFirstFile Lib "kernel32" _ Alias "FindFirstFileA" _ (ByVal lpFileName As String, _ lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function FindNextFile Lib "kernel32" _ Alias "FindNextFileA" _ (ByVal hFindFile As Long, _ lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function GetTickCount Lib "kernel32" () As Long Private Declare Function lstrlen Lib "kernel32" _ Alias "lstrlenW" (ByVal lpString As Long) As Long Private Declare Function PathMatchSpec Lib "shlwapi" _ Alias "PathMatchSpecW" _ (ByVal pszFileParam As Long, _ ByVal pszSpec As Long) As Long Private fp As FILE_PARAMS 'holds search parameters Private mWordFilesCol As Collection Private mExcelFilesCol As Collection Private mPPFilesCol As Collection Private mLessThan3 As Long Private mLessThan6 As Long Private mLessThan12 As Long Private mMoreThan12 As Long Private m3Months As FILETIME Private m6Months As FILETIME Private m12Months As FILETIME Private mDocCount As Long Private mDotCount As Long Private mXlsCount As Long Private mXltCount As Long Private mPptCount As Long Private mPotCount As Long Private mIgnoredDocs As Long Private mbDocSearch As Boolean Private mbDotSearch As Boolean Private mbXlsSearch As Boolean Private mbXltSearch As Boolean Private mbPptSearch As Boolean Private mbPotSearch As Boolean Private mWordDriverPath As String Private mExcelDriverPath As String Private mPPDriverPath As String Private Sub Class_Initialize() Set mWordFilesCol = New Collection Set mExcelFilesCol = New Collection Set mPPFilesCol = New Collection End Sub Private Sub Class_Terminate() Set mWordFilesCol = Nothing Set mExcelFilesCol = Nothing Set mPPFilesCol = Nothing End Sub Public Property Get DocCount() As Long DocCount = mDocCount End Property Public Property Get DotCount() As Long DotCount = mDotCount End Property Public Property Get XlsCount() As Long XlsCount = mXlsCount End Property Public Property Get XltCount() As Long XltCount = mXltCount End Property Public Property Get PptCount() As Long PptCount = mPptCount End Property Public Property Get PotCount() As Long PotCount = mPotCount End Property Public Property Get IgnoredDocCount() As Long IgnoredDocCount = mIgnoredDocs End Property Public Property Get DocsLessThan3Months() As Long DocsLessThan3Months = mLessThan3 End Property Public Property Get DocsLessThan6Months() As Long DocsLessThan6Months = mLessThan6 End Property Public Property Get DocsLessThan12Months() As Long DocsLessThan12Months = mLessThan12 End Property Public Property Get DocsMoreThan12Months() As Long DocsMoreThan12Months = mMoreThan12 End Property Public Property Get WordFiles() As Collection Set WordFiles = mWordFilesCol End Property Public Property Get ExcelFiles() As Collection Set ExcelFiles = mExcelFilesCol End Property Public Property Get PowerPointFiles() As Collection Set PowerPointFiles = mPPFilesCol End Property Public Function count() As Long count = mWordFilesCol.count + mExcelFilesCol.count + mPPFilesCol.count End Function Public Function Search(rootDir As String, FileSpecs As Collection, IncludeSubdirs As Boolean, _ ignoreOld As Boolean, Months As Integer) As Boolean On Error GoTo HandleErrors Dim currentFunctionName As String currentFunctionName = "Search" Dim tstart As Single 'timer var for this routine only Dim tend As Single 'timer var for this routine only Dim spec As Variant Dim allSpecs As String Dim fso As New FileSystemObject Search = True If FileSpecs.count = 0 Then Exit Function If FileSpecs.count > 1 Then For Each spec In FileSpecs allSpecs = allSpecs & "; " & spec SetSearchBoolean CStr(spec) Next Else allSpecs = FileSpecs(1) SetSearchBoolean CStr(FileSpecs(1)) End If mWordDriverPath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CWORD_DRIVER_FILE) mExcelDriverPath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CEXCEL_DRIVER_FILE) mPPDriverPath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CPP_DRIVER_FILE) With fp .sFileRoot = QualifyPath(rootDir) .sFileNameExt = allSpecs .bRecurse = IncludeSubdirs .nSearched = 0 End With Load SearchDocs ignoreOld = ignoreOld And InitFileTimes Dim limDate As FILETIME If ignoreOld Then If Months = 3 Then limDate = m3Months ElseIf Months = 6 Then limDate = m6Months ElseIf Months = 12 Then limDate = m12Months Else ignoreOld = False End If End If 'tstart = GetTickCount() Search = SearchForFiles(QualifyPath(rootDir), IncludeSubdirs, ignoreOld, limDate) 'tend = GetTickCount() Unload SearchDocs 'Debug: 'MsgBox "Specs " & allSpecs & vbLf & _ ' Format$(fp.nSearched, "###,###,###,##0") & vbLf & _ ' Format$(count, "###,###,###,##0") & vbLf & _ ' FormatNumber((tend - tstart) / 1000, 2) & " seconds" FinalExit: Set fso = Nothing Exit Function HandleErrors: WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source Resume FinalExit End Function Sub SetSearchBoolean(spec As String) If spec = "*.doc" Then mbDocSearch = True End If If spec = "*.dot" Then mbDotSearch = True End If If spec = "*.xls" Then mbXlsSearch = True End If If spec = "*.xlt" Then mbXltSearch = True End If If spec = "*.ppt" Then mbPptSearch = True End If If spec = "*.pot" Then mbPotSearch = True End If End Sub Private Function SearchForFiles(sRoot As String, bRecurse As Boolean, _ bIgnoreOld As Boolean, limDate As FILETIME) As Boolean On Error GoTo HandleErrors Dim currentFunctionName As String currentFunctionName = "SearchForFiles" Dim WFD As WIN32_FIND_DATA Dim hFile As Long Dim path As String Dim sFileName As String Dim nTotal As Long SearchForFiles = False hFile = FindFirstFile(sRoot & ALL_FILES, WFD) If hFile = INVALID_HANDLE_VALUE Then GoTo FinalExit Do If (SearchDocs.g_SD_Abort) Then GoTo FinalExit sFileName = TrimNull(WFD.cFileName) 'if a folder, and recurse specified, call 'method again If (WFD.dwFileAttributes And vbDirectory) Then If (Asc(WFD.cFileName) <> vbDot) And bRecurse Then SearchForFiles sRoot & sFileName & vbBackslash, bRecurse, bIgnoreOld, limDate End If Else 'must be a file.. nTotal = mDocCount + mDotCount + mXlsCount + _ mXltCount + mPptCount + mPotCount SearchDocs.SD_UpdateProgress str$(nTotal), sRoot DoEvents If mbDocSearch Then If MatchSpec(WFD.cFileName, "*.doc") Then path = sRoot & sFileName 'If StrComp(path, mWordDriverPath, vbTextCompare) <> 0 Then If Not MatchSpec(path, mWordDriverPath) Then If (IsTooOld(WFD, limDate, bIgnoreOld)) Then mIgnoredDocs = mIgnoredDocs + 1 Else mDocCount = mDocCount + 1 mWordFilesCol.add path End If End If GoTo CONTINUE_LOOP End If End If If mbDotSearch Then If MatchSpec(WFD.cFileName, "*.dot") Then If (IsTooOld(WFD, limDate, bIgnoreOld)) Then mIgnoredDocs = mIgnoredDocs + 1 Else mDotCount = mDotCount + 1 mWordFilesCol.add sRoot & sFileName End If GoTo CONTINUE_LOOP End If End If If mbXlsSearch Then If MatchSpec(WFD.cFileName, "*.xls") Then 'If StrComp(sFileName, CEXCEL_DRIVER_FILE, vbTextCompare) <> 0 Then If Not MatchSpec(WFD.cFileName, CEXCEL_DRIVER_FILE) Then If (IsTooOld(WFD, limDate, bIgnoreOld)) Then mIgnoredDocs = mIgnoredDocs + 1 Else mXlsCount = mXlsCount + 1 mExcelFilesCol.add sRoot & sFileName End If End If GoTo CONTINUE_LOOP End If End If If mbXltSearch Then If MatchSpec(WFD.cFileName, "*.xlt") Then If (IsTooOld(WFD, limDate, bIgnoreOld)) Then mIgnoredDocs = mIgnoredDocs + 1 Else mXltCount = mXltCount + 1 mExcelFilesCol.add sRoot & sFileName End If GoTo CONTINUE_LOOP End If End If If mbPptSearch Then If MatchSpec(WFD.cFileName, "*.ppt") Then path = sRoot & sFileName 'If StrComp(path, mPPDriverPath, vbTextCompare) <> 0 Then If Not MatchSpec(path, mPPDriverPath) Then If (IsTooOld(WFD, limDate, bIgnoreOld)) Then mIgnoredDocs = mIgnoredDocs + 1 Else mPptCount = mPptCount + 1 mPPFilesCol.add path End If End If GoTo CONTINUE_LOOP End If End If If mbPotSearch Then If MatchSpec(WFD.cFileName, "*.pot") Then If (IsTooOld(WFD, limDate, bIgnoreOld)) Then mIgnoredDocs = mIgnoredDocs + 1 Else mPotCount = mPotCount + 1 mPPFilesCol.add sRoot & sFileName End If GoTo CONTINUE_LOOP End If End If End If 'If WFD.dwFileAttributes CONTINUE_LOOP: fp.nSearched = fp.nSearched + 1 Loop While FindNextFile(hFile, WFD) SearchForFiles = True FinalExit: Call FindClose(hFile) Exit Function HandleErrors: WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source Resume FinalExit End Function Private Function QualifyPath(sPath As String) As String If Right$(sPath, 1) <> vbBackslash Then QualifyPath = sPath & vbBackslash Else: QualifyPath = sPath End If End Function Private Function TrimNull(startstr As String) As String TrimNull = Left$(startstr, lstrlen(StrPtr(startstr))) End Function Private Function MatchSpec(sFile As String, sSpec As String) As Boolean MatchSpec = PathMatchSpec(StrPtr(sFile), StrPtr(sSpec)) End Function Private Function IsTooOld(aWFD As WIN32_FIND_DATA, minDate As FILETIME, _ ignoreOld As Boolean) As Boolean IsTooOld = False Dim aFileTime As FILETIME If (aWFD.ftLastWriteTime.dwHighDateTime <> 0) Then aFileTime = aWFD.ftLastWriteTime ElseIf (aWFD.ftCreationTime.dwHighDateTime <> 0) Then aFileTime = aWFD.ftCreationTime Else ' No valid time found, don't ignore file mLessThan3 = mLessThan3 + 1 Exit Function End If If (ignoreOld) Then If (CompareFileTime(aFileTime, minDate) < 0) Then IsTooOld = True End If End If If (CompareFileTime(aWFD.ftLastWriteTime, m12Months) < 0) Then mMoreThan12 = mMoreThan12 + 1 ElseIf (CompareFileTime(aWFD.ftLastWriteTime, m6Months) < 0) Then mLessThan12 = mLessThan12 + 1 ElseIf (CompareFileTime(aWFD.ftLastWriteTime, m3Months) < 0) Then mLessThan6 = mLessThan6 + 1 Else mLessThan3 = mLessThan3 + 1 End If End Function Private Function BasicDateToFileTime(basDate As Date, _ fileDate As FILETIME) As Boolean Dim sysDate As SYSTEMTIME Dim retval As Long sysDate.wYear = DatePart("yyyy", basDate) sysDate.wMonth = DatePart("m", basDate) sysDate.wDay = DatePart("d", basDate) sysDate.wHour = DatePart("h", basDate) sysDate.wMinute = DatePart("m", basDate) retval = SystemTimeToFileTime(sysDate, fileDate) If (retval = 0) Then BasicDateToFileTime = False Else BasicDateToFileTime = True End If End Function Private Function InitFileTimes() As Boolean Dim nowDate As Date Dim basDate As Date InitFileTimes = True nowDate = Now() basDate = DateAdd("m", -3, nowDate) If Not BasicDateToFileTime(basDate, m3Months) Then InitFileTimes = False basDate = DateAdd("m", -6, nowDate) If Not BasicDateToFileTime(basDate, m6Months) Then InitFileTimes = False basDate = DateAdd("yyyy", -1, nowDate) If Not BasicDateToFileTime(basDate, m12Months) Then InitFileTimes = False mMoreThan12 = 0 mLessThan12 = 0 mLessThan6 = 0 mLessThan3 = 0 End Function