blob: 9ab153b40729b82afad9791aafe5a8a66b6ff0a7 [file] [log] [blame]
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