{"id":321,"date":"2009-09-14T22:53:36","date_gmt":"2009-09-15T01:53:36","guid":{"rendered":"http:\/\/leandroascierto.com\/blog\/?p=321"},"modified":"2011-08-27T08:39:26","modified_gmt":"2011-08-27T11:39:26","slug":"clase-para-buscar","status":"publish","type":"post","link":"https:\/\/leandroascierto.com\/blog\/clase-para-buscar\/","title":{"rendered":"Clase para Buscar"},"content":{"rendered":"<p style=\"text-align: justify;\">Esta clase sirve para buscar archivos y carpetas, est\u00e1 bien completa ya que podemos aplicar filtros tales como fecha de modificaci\u00f3n, creaci\u00f3n y de \u00faltimo acceso, tambi\u00e9n tama\u00f1o m\u00ednimo y m\u00e1ximo. Cuenta con un filtro en el que podemos indicar con asteriscos ( * ) y signos de interrogaci\u00f3n ( ? ) para lograr una b\u00fasqueda exacta. Resumiendo cuenta con las mismas opciones que el buscador de Windows, adem\u00e1s corrige el fallo de XP en buscar una palabra dentro de un archivo, es decir, supongamos que quisi\u00e9ramos buscar la palabra \u00abConnectionString\u00bb en uno de nuestros proyectos, entonces podremos poner *.frm; *.bas\u00a0 y nos buscar\u00e1 dicha palabra en todos los formularios y m\u00f3dulos que se encuentren el directorio previamente indicado.<\/p>\n<p align=\"center\">\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.leandroascierto.com\/blog\/imagenes\/Buscador.png\" alt=\"Buscador de Archivos\" longdesc=\"file:\/\/\/C:\/Documents%20and%20Settings\/Administrador\/Escritorio\/Buscador.png\" width=\"533\" height=\"436\" \/><\/p>\n<pre class=\"brush: vb; title: ; notranslate\" title=\"\">\r\n\r\nOption Explicit\r\n'---------------------------------------------------------------------------------------\r\n' Module      : ClsSearch\r\n' DateTime    : 31\/08\/2010\r\n' Author      : Leandro Ascierto\r\n' WebPage     : http:\/\/www.leandroascierto.com.ar\r\n' Purpose     : File and Folder search class\r\n' Reference   : cFileList by Cobein(http:\/\/www.advancevb.com.ar)\r\n' Credits     : raul338 and *PsYkE1* for regular expressions\r\n' Tested on   : XP-SP3, Vista Home Premium and Seven\r\n' Requirements: None\r\n'\r\n' History     : 31\/08\/2010 - First Cut\r\n'---------------------------------------------------------------------------------------\r\n\r\n'Apis\r\nPrivate Declare Function FindFirstFile Lib &quot;kernel32&quot; Alias &quot;FindFirstFileA&quot; (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long\r\nPrivate Declare Function FindNextFile Lib &quot;kernel32&quot; Alias &quot;FindNextFileA&quot; (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long\r\nPrivate Declare Function FindClose Lib &quot;kernel32&quot; (ByVal hFindFile As Long) As Long\r\nPrivate Declare Function lstrlen Lib &quot;kernel32&quot; Alias &quot;lstrlenA&quot; (ByVal lpString As String) As Long\r\nPrivate Declare Function SystemTimeToFileTime Lib &quot;kernel32.dll&quot; (ByRef lpSystemTime As SYSTEMTIME, ByRef lpFileTime As FILETIME) As Long\r\nPrivate Declare Function CompareFileTime Lib &quot;kernel32.dll&quot; (ByRef lpFileTime1 As FILETIME, ByRef lpFileTime2 As FILETIME) As Long\r\nPrivate Declare Function CreateFile Lib &quot;kernel32&quot; Alias &quot;CreateFileA&quot; (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long\r\nPrivate Declare Function ReadFile Lib &quot;kernel32.dll&quot; (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, ByRef lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long\r\nPrivate Declare Function CloseHandle Lib &quot;kernel32.dll&quot; (ByVal hObject As Long) As Long\r\nPrivate Declare Function LocalFileTimeToFileTime Lib &quot;kernel32&quot; (lpLocalFileTime As FILETIME, lpFileTime As FILETIME) As Long\r\nPrivate Declare Function FileTimeToLocalFileTime Lib &quot;kernel32&quot; (lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long\r\nPrivate Declare Function GetFileSize Lib &quot;kernel32.dll&quot; (ByVal hFile As Long, ByRef lpFileSizeHigh As Long) As Long\r\nPrivate Declare Function SetFilePointer Lib &quot;kernel32.dll&quot; (ByVal hFile As Long, ByVal lDistanceToMove As Long, ByRef lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long\r\nPrivate Declare Sub CopyMemory Lib &quot;kernel32.dll&quot; Alias &quot;RtlMoveMemory&quot; (Destination As Any, Source As Any, ByVal Length As Long)\r\nPrivate Declare Function CharUpperBuffA&amp; Lib &quot;user32&quot; (lpsz As Any, ByVal cchLength&amp;)\r\nPrivate Declare Function GetLogicalDriveStrings Lib &quot;kernel32&quot; Alias &quot;GetLogicalDriveStringsA&quot; (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long\r\nPrivate Declare Function GetDriveType Lib &quot;kernel32&quot; Alias &quot;GetDriveTypeA&quot; (ByVal nDrive As String) As Long\r\n \r\n'Constantes\r\nPrivate Const DRIVE_FIXED               As Long = 3\r\nPrivate Const MAX_PATH                  As Long = 260\r\nPrivate Const INVALID_HANDLE_VALUE      As Long = -1\r\nPrivate Const FILE_ATTRIBUTE_DIRECTORY  As Long = &amp;H10\r\nPrivate Const GENERIC_READ              As Long = &amp;H80000000\r\nPrivate Const FILE_SHARE_READ           As Long = &amp;H1\r\nPrivate Const OPEN_EXISTING             As Long = 3\r\nPrivate Const FILE_BEGIN                As Long = 0\r\n \r\n'Type\r\nPrivate Type FILETIME\r\n    dwLowDateTime As Long\r\n    dwHighDateTime As Long\r\nEnd Type\r\n \r\nPrivate Type LARGE_INTEGER\r\n    LowPart As Long\r\n    HighPart As Long\r\nEnd Type\r\n \r\nPrivate Type SYSTEMTIME\r\n    wYear As Integer\r\n    wMonth As Integer\r\n    wDayOfWeek As Integer\r\n    wDay As Integer\r\n    wHour As Integer\r\n    wMinute As Integer\r\n    wSecond As Integer\r\n    wMilliseconds As Integer\r\nEnd Type\r\n \r\nPrivate Type WIN32_FIND_DATA\r\n    dwFileAttributes As Long\r\n    ftCreationTime As FILETIME\r\n    ftLastAccessTime As FILETIME\r\n    ftLastWriteTime As FILETIME\r\n    nFileSizeHigh As Long\r\n    nFileSizeLow As Long\r\n    dwReserved0 As Long\r\n    dwReserved1 As Long\r\n    cFileName As String * MAX_PATH\r\n    cAlternate As String * 14\r\nEnd Type\r\n \r\n'Enumere\r\nPublic Enum eDateTimeFilter\r\n    NoDateTimeFilter = 0\r\n    LastWriteTime = 1\r\n    CreationTime = 2\r\n    LastAccessTime = 3\r\nEnd Enum\r\n \r\nPublic Enum eFileSizeFilter\r\n    NoFilterSize = 0\r\n    MinSize = 1\r\n    MaxSize = 2\r\n    MinAndMax = 3\r\nEnd Enum\r\n \r\n'Events\r\nPublic Event FileFound(ByVal sPath As String, ByVal sFile As String, ByVal bZipFile As Boolean)\r\nPublic Event FolderFound(ByVal sPath As String, ByVal sFolder As String, ByVal bZipFolder As Boolean)\r\nPublic Event SearchWordInFile(ByVal sFile As String)\r\n \r\nPrivate aUChars(255)        As Byte\r\nPrivate c_bCancel           As Boolean\r\nPrivate c_cFolders          As Collection\r\nPrivate c_cFiles            As Collection\r\nPrivate m_FindInSubFolder   As Boolean\r\nPrivate m_DoEvents          As Boolean\r\nPrivate m_MinDate           As Date\r\nPrivate m_MaxDate           As Date\r\nPrivate m_FT_MinDate        As FILETIME\r\nPrivate m_FT_MaxDate        As FILETIME\r\nPrivate m_MinSize           As Currency\r\nPrivate m_MaxSize           As Currency\r\nPrivate m_SpecificWord      As String\r\nPrivate m_FilterDateTime    As eDateTimeFilter\r\nPrivate m_FilterFileSize    As eFileSizeFilter\r\nPrivate m_SearchInSysFolder As Boolean\r\nPrivate m_SearchInSubFolder As Boolean\r\nPrivate m_SearchHidePath    As Boolean\r\nPrivate m_WindowsDir        As String\r\nPrivate m_StrMatch          As String\r\nPrivate m_IgnoreCase        As Boolean\r\nPrivate m_sPath             As String\r\nPrivate m_SearchInZipFolder As Boolean\r\nPrivate oRegExp             As Object\r\nPrivate objShell            As Object\r\n \r\n'Property Let\r\nPublic Property Let SearchInZipFolder(ByVal Value As Boolean): m_SearchInZipFolder = Value: End Property\r\nPublic Property Let IgnoreCase(ByVal Value As Boolean): m_IgnoreCase = Value: End Property\r\nPublic Property Let Path(ByVal sValue As String): m_sPath = sValue: End Property\r\nPublic Property Let CallDoEvents(ByVal Value As Boolean): m_DoEvents = Value: End Property\r\nPublic Property Let Match(ByVal sValue As String): m_StrMatch = sValue: End Property\r\nPublic Property Let SearchInSubFolder(ByVal Value As Boolean): m_SearchInSubFolder = Value: End Property\r\nPublic Property Let SearchInSystemFolder(ByVal Value As Boolean): m_SearchInSysFolder = Value: End Property\r\nPublic Property Let SearchHidePath(ByVal Value As Boolean): m_SearchHidePath = Value: End Property\r\nPublic Property Let SpecificWord(ByVal sWord As String): m_SpecificWord = sWord: End Property\r\nPublic Property Let FilterDateTime(ByVal Value As eDateTimeFilter): m_FilterDateTime = Value: End Property\r\nPublic Property Let MinFileSize(ByVal NewSize As Currency): m_MinSize = NewSize: End Property\r\nPublic Property Let MaxFileSize(ByVal NewSize As Currency): m_MaxSize = NewSize: End Property\r\nPublic Property Let FilterFileSize(ByVal Value As eFileSizeFilter): m_FilterFileSize = Value: End Property\r\nPublic Property Let MinDate(ByVal NewDate As Date): m_MinDate = NewDate: End Property\r\nPublic Property Let MaxDate(ByVal NewDate As Date): m_MaxDate = NewDate: End Property\r\n \r\n'Property Get\r\nPublic Property Get SearchInZipFolder() As Boolean: SearchInZipFolder = m_SearchInZipFolder: End Property\r\nPublic Property Get IgnoreCase() As Boolean: IgnoreCase = m_IgnoreCase: End Property\r\nPublic Property Get Path() As String: Path = m_sPath: End Property\r\nPublic Property Get CallDoEvents() As Boolean: CallDoEvents = m_DoEvents: End Property\r\nPublic Property Get Match() As String: Match = m_StrMatch: End Property\r\nPublic Property Get SearchInSubFolder() As Boolean: SearchInSubFolder = m_SearchInSubFolder: End Property\r\nPublic Property Get SearchInSystemFolder() As Boolean: SearchInSystemFolder = m_SearchInSysFolder: End Property\r\nPublic Property Get SearchHidePath() As Boolean: SearchHidePath = m_SearchHidePath: End Property\r\nPublic Property Get SpecificWord() As String: SpecificWord = m_SpecificWord: End Property\r\nPublic Property Get FilterDateTime() As eDateTimeFilter: FilterDateTime = m_FilterDateTime: End Property\r\nPublic Property Get MinFileSize() As Currency: MinFileSize = m_MinSize: End Property\r\nPublic Property Get MaxFileSize() As Currency: MaxFileSize = m_MaxSize: End Property\r\nPublic Property Get FilterFileSize() As eFileSizeFilter: FilterFileSize = m_FilterFileSize: End Property\r\nPublic Property Get MinDate() As Date: MinDate = m_MinDate: End Property\r\nPublic Property Get MaxDate() As Date: MaxDate = m_MaxDate: End Property\r\n \r\nPublic Function Folders() As Collection: Set Folders = c_cFolders: End Function\r\nPublic Function Files() As Collection: Set Files = c_cFiles: End Function\r\n \r\nPublic Sub Cancel(): c_bCancel = True: End Sub\r\n \r\nPublic Sub StartSearch()\r\n    Dim ArrPaths() As String\r\n    Dim i As Long\r\n \r\n    Set c_cFolders = New Collection\r\n    Set c_cFiles = New Collection\r\n    Set oRegExp = CreateObject(&quot;VBScript.RegExp&quot;)\r\n  \r\n    m_FT_MinDate = DateToFileTime(m_MinDate)\r\n    m_FT_MaxDate = DateToFileTime(m_MaxDate)\r\n \r\n    c_bCancel = False\r\n \r\n    With oRegExp\r\n        .Pattern = ReplaceFilter(m_StrMatch)\r\n        Debug.Print .Pattern\r\n        .Global = True\r\n        .IgnoreCase = m_IgnoreCase\r\n    End With\r\n \r\n    If m_SearchInZipFolder Then\r\n        Set objShell = CreateObject(&quot;Shell.Application&quot;)\r\n    End If\r\n \r\n    ArrPaths = Split(m_sPath, &quot;;&quot;)\r\n \r\n    For i = 0 To UBound(ArrPaths)\r\n        pvFindFiles Trim(ArrPaths(i))\r\n        If c_bCancel Then Exit For\r\n    Next\r\n \r\n    Set oRegExp = Nothing\r\n    Set objShell = Nothing\r\nEnd Sub \r\n \r\nPrivate Function pvFindFiles(ByVal sPath As String) As Boolean\r\n \r\n    Dim lRet                As Long\r\n    Dim lDateDiff           As Long\r\n    Dim lhSearch            As Long\r\n    Dim tWFD                As WIN32_FIND_DATA\r\n    Dim svDirs()            As String\r\n    Dim lCount              As Long\r\n    Dim sDir                As String\r\n    Dim sFile               As String\r\n    Dim i                   As Long\r\n    Dim sFolder             As String\r\n    Dim FileSize            As Currency\r\n    Dim tFT                 As FILETIME\r\n    Dim sMatch              As String\r\n \r\n    If c_bCancel Then Exit Function \r\n    Call NormalizePath(sPath) \r\n    lhSearch = FindFirstFile(sPath &amp; &quot;*&quot;, tWFD) \r\n    If Not lhSearch = INVALID_HANDLE_VALUE Then\r\n \r\n        Do\r\n            If (tWFD.dwFileAttributes And vbDirectory) &lt;&gt; vbDirectory Then \r\n                sFile = StripNulls(tWFD.cFileName) \r\n                If m_SearchInZipFolder Then\r\n                    If Len(m_SpecificWord) = 0 Then\r\n                        If UCase$(Right$(sFile, 4)) = &quot;.ZIP&quot; Then\r\n                            Call FindInZipFolder(sPath &amp; sFile)\r\n                        End If\r\n                    End If\r\n                End If\r\n \r\n                If Not m_SearchHidePath Then\r\n                    If (tWFD.dwFileAttributes And vbHidden) = vbHidden Then GoTo FINDNEXT\r\n                End If\r\n \r\n                If m_FilterDateTime &lt;&gt; NoDateTimeFilter Then \r\n                    If m_FilterDateTime = LastWriteTime Then\r\n                        tFT = tWFD.ftLastWriteTime\r\n                    ElseIf m_FilterDateTime = CreationTime Then\r\n                        tFT = tWFD.ftCreationTime\r\n                    Else 'If m_FilterDateTime = LastAccessTime Then\r\n                        tFT = tWFD.ftLastAccessTime\r\n                    End If \r\n                    If Not ((CompareFileTime(tFT, m_FT_MinDate) &gt;= 0) And (CompareFileTime(tFT, m_FT_MaxDate) &lt;= 0)) Then GoTo FINDNEXT \r\n                End If\r\n  \r\n                If m_FilterFileSize &lt;&gt; NoFilterSize Then \r\n                    FileSize = LargeIntToCurrency(tWFD.nFileSizeLow, tWFD.nFileSizeHigh)\r\n \r\n                    If m_FilterFileSize = MinSize Then\r\n                        If FileSize &lt; m_MinSize Then GoTo FINDNEXT\r\n                    ElseIf m_FilterFileSize = MaxSize Then\r\n                        If FileSize &gt;= m_MaxSize Then GoTo FINDNEXT\r\n                    Else 'if m_FilterFileSize = MinAndMax Then\r\n                        If (FileSize &lt; m_MinSize And FileSize &gt; m_MaxSize) Then GoTo FINDNEXT\r\n                    End If\r\n \r\n                End If\r\n \r\n                If oRegExp.Execute(sFile).Count = 0 Then GoTo FINDNEXT \r\n                If Len(m_SpecificWord) Then\r\n                    RaiseEvent SearchWordInFile(sPath &amp; sFile)\r\n                    If Not FindWordInFile(sPath &amp; sFile, m_SpecificWord) Then GoTo FINDNEXT\r\n                End If\r\n \r\n                Call c_cFiles.Add(sPath &amp; sFile)\r\n                 RaiseEvent FileFound(sPath, sFile, False)\r\n            Else \r\n                If Not m_SearchHidePath Then\r\n                    If (tWFD.dwFileAttributes And vbHidden) = vbHidden Then GoTo FINDNEXT\r\n                End If \r\n                sFolder = StripNulls(tWFD.cFileName) \r\n                If InStrB(sFolder, &quot;.&quot;) &lt;&gt; 1 Then \r\n                    sDir = sPath &amp; sFolder &amp; &quot;\\&quot; \r\n                    If Not m_SearchInSysFolder Then\r\n                        If sDir = m_WindowsDir Then GoTo FINDNEXT\r\n                    End If\r\n \r\n                    ReDim Preserve svDirs(lCount)\r\n                    svDirs(lCount) = sDir\r\n                    lCount = lCount + 1\r\n \r\n                    If m_FilterFileSize &lt;&gt; NoFilterSize Then\r\n                        If m_FilterFileSize = MinSize Then GoTo FINDNEXT\r\n                        If m_FilterFileSize = MinAndMax Then GoTo FINDNEXT\r\n                    End If\r\n \r\n                    If oRegExp.Execute(sFolder).Count = 0 Then GoTo FINDNEXT\r\n \r\n                    Call c_cFolders.Add(sFolder)\r\n                    RaiseEvent FolderFound(sPath, sFolder, False)\r\n                End If\r\n            End If\r\n \r\nFINDNEXT:\r\n \r\n            If c_bCancel Then Call FindClose(lhSearch): Exit Function \r\n            If m_DoEvents Then DoEvents \r\n            lRet = FindNextFile(lhSearch, tWFD) \r\n        Loop While lRet \r\n        Call FindClose(lhSearch) \r\n    End If \r\n \r\n    If m_SearchInSubFolder Then\r\n        For i = 0 To lCount - 1\r\n            Call pvFindFiles(svDirs(i))\r\n        Next\r\n    End If\r\n \r\nEnd Function\r\n \r\nPrivate Function FindInZipFolder(ByVal Root As String, Optional ByVal sPath As String)\r\n    Dim objFolder As Object\r\n    Dim oItem As Object\r\n    Dim sFolder As String\r\n    Dim sFile As String\r\n    Dim ItemName As String\r\n    Dim FileSize As Currency\r\n    Dim tFT As FILETIME\r\n \r\n    Set objFolder = objShell.NameSpace(CVar(Root &amp; sPath)) \r\n    If objFolder Is Nothing Then Exit Function \r\n    For Each oItem In objFolder.ITEMS() \r\n        If Not oItem.IsFolder Then \r\n            ItemName = Right(oItem.Path, Len(oItem.Path) - InStrRev(oItem.Path, &quot;\/&quot;)) \r\n            If oRegExp.Execute(ItemName).Count = 0 Then GoTo FINDNEXT \r\n            If m_FilterDateTime &lt;&gt; NoDateTimeFilter Then \r\n                If m_FilterDateTime &lt;&gt; LastWriteTime Then\r\n                    GoTo FINDNEXT\r\n                End If \r\n                tFT = DateToFileTime(CDate(objFolder.ParentFolder.GetDetailsOf(oItem, 7))) \r\n                If Not ((CompareFileTime(tFT, m_FT_MinDate) &gt;= 0) And (CompareFileTime(tFT, m_FT_MaxDate) &lt;= 0)) Then GoTo FINDNEXT \r\n            End If\r\n \r\n            If m_FilterFileSize &lt;&gt; NoFilterSize Then \r\n                FileSize = oItem.Size \r\n                If m_FilterFileSize = MinSize Then\r\n                    If oItem.Size &lt; m_MinSize Then GoTo FINDNEXT\r\n                ElseIf m_FilterFileSize = MaxSize Then\r\n                    If FileSize &gt;= m_MaxSize Then GoTo FINDNEXT\r\n                Else 'if m_FilterFileSize = MinAndMax Then\r\n                    If (FileSize &lt; m_MinSize And FileSize &gt; m_MaxSize) Then GoTo FINDNEXT\r\n                End If \r\n            End If\r\n \r\n            sFile = Root &amp; &quot;\\&quot; &amp; oItem.Path\r\n \r\n            Call c_cFiles.Add(sFile)\r\n            RaiseEvent FileFound(Root, oItem.Path, True)\r\n \r\n        Else\r\n \r\n            If m_FilterFileSize &lt;&gt; NoFilterSize Then\r\n                If m_FilterFileSize = MinSize Then GoTo FINDNEXTFOLDER\r\n            End If\r\n \r\n            If m_FilterDateTime &lt;&gt; NoDateTimeFilter Then GoTo FINDNEXTFOLDER\r\n \r\n            If oRegExp.Execute(oItem).Count = 0 Then GoTo FINDNEXTFOLDER \r\n            sFolder = Root &amp; &quot;\\&quot; &amp; oItem.Path \r\n            Call c_cFolders.Add(sFolder)\r\n            RaiseEvent FolderFound(Root &amp; &quot;\\&quot;, oItem.Path, True)\r\n \r\nFINDNEXTFOLDER:\r\n \r\n            If c_bCancel Then Exit Function \r\n            If m_DoEvents Then DoEvents \r\n            FindInZipFolder Root, &quot;\\&quot; &amp; oItem.Path \r\n \r\n        End If\r\n \r\nFINDNEXT:\r\n \r\n        If c_bCancel Then Exit Function \r\n        If m_DoEvents Then DoEvents \r\n    Next\r\n \r\nEnd Function\r\n \r\nPrivate Function FindWordInFile(ByVal sPath As String, ByVal sWord As String, Optional ByVal bUnicode As Boolean) As Boolean\r\n    Dim bArray() As Byte\r\n    Dim lRet As Long\r\n    Dim hFile As Long\r\n    Dim sFind() As Byte\r\n    Dim s As String\r\n    Dim t As Long\r\n    Dim i As Long\r\n    Dim FileSize As Currency\r\n    Dim tLI As LARGE_INTEGER\r\n    Dim LenBuffer As Long\r\n    Dim CurPos As Currency\r\n \r\n    sWord = UCase(sWord)\r\n    If bUnicode Then sWord = StrConv(sWord, vbUnicode)\r\n    sFind = StrConv(sWord, vbFromUnicode)\r\n \r\n    hFile = CreateFile(sPath, GENERIC_READ, FILE_SHARE_READ, ByVal 0&amp;, OPEN_EXISTING, 0, 0) \r\n    If hFile &lt;&gt; INVALID_HANDLE_VALUE Then \r\n \r\n        tLI.LowPart = GetFileSize(hFile, tLI.HighPart) \r\n        LenBuffer = &amp;H2800 ' 10 KB    \r\n        FileSize = LargeIntToCurrency(tLI.LowPart, tLI.HighPart) \r\n        If FileSize &lt; UBound(sFind) Then GoTo OutSearch \r\n        If LenBuffer &gt; FileSize Then LenBuffer = FileSize \r\n        ReDim bArray(LenBuffer - 1)\r\n \r\n        Do\r\n            ReadFile hFile, bArray(0), UBound(bArray) + 1, lRet, 0&amp; \r\n            If lRet = 0 Then Exit Do \r\n            CurPos = CurPos + lRet\r\n \r\n            If lRet &lt; LenBuffer Then\r\n                ReDim Preserve bArray(lRet)\r\n            End If\r\n \r\n            If InBytes(bArray, sFind) &lt;&gt; -1 Then\r\n                FindWordInFile = True\r\n                Exit Do\r\n            End If\r\n \r\n            If CurPos = FileSize Then Exit Do \r\n            tLI = CurrencyToLargeInt(CurPos - UBound(sFind) + 1) \r\n            SetFilePointer hFile, tLI.LowPart, tLI.HighPart, FILE_BEGIN \r\n            If c_bCancel Then GoTo OutSearch\r\n        Loop\r\n \r\nOutSearch:\r\n \r\n        CloseHandle hFile\r\n \r\n    End If\r\nEnd Function\r\n \r\nPrivate Function InBytes(ByRef bvSource() As Byte, ByRef bvMatch() As Byte) As Long\r\n \r\n    Dim i       As Long\r\n    Dim J       As Long\r\n    Dim lChr    As Byte\r\n    Dim LenMach As Long\r\n \r\n    LenMach = UBound(bvMatch)\r\n \r\n    lChr = bvMatch(0) \r\n    If LenMach &gt; 0 Then \r\n        For i = 0 To UBound(bvSource) - LenMach \r\n            If (lChr = aUChars(bvSource(i))) Then \r\n                J = LenMach - 1\r\n \r\n                Do\r\n                    If bvMatch(J) &lt;&gt; aUChars(bvSource(i + J)) Then GoTo NotEqual\r\n                    J = J - 1\r\n                Loop While J \r\n                InBytes = i \r\n                Exit Function \r\n            End If\r\nNotEqual:\r\n \r\n        Next \r\n    Else\r\n        For i = 0 To UBound(bvSource)\r\n            If (lChr = aUChars(bvSource(i))) Then\r\n                InBytes = i\r\n                Exit Function\r\n            End If\r\n        Next\r\n    End If\r\n \r\n    InBytes = -1\r\nEnd Function\r\n \r\nPrivate Function StripNulls(sData As String) As String\r\n    StripNulls = Left$(sData, lstrlen(sData))\r\nEnd Function\r\n \r\nPrivate Sub NormalizePath(sData As String)\r\n    sData = IIf(Right$(sData, 1) = &quot;\\&quot;, sData, sData &amp; &quot;\\&quot;)\r\nEnd Sub\r\n \r\nPrivate Function DateToFileTime(ByVal vbDate As Date) As FILETIME\r\n    Dim ST As SYSTEMTIME\r\n \r\n    With ST\r\n        .wYear = Year(vbDate)\r\n        .wMonth = Month(vbDate)\r\n        .wDay = Day(vbDate)\r\n        .wHour = Hour(vbDate)\r\n        .wMinute = Minute(vbDate)\r\n        .wSecond = Second(vbDate)\r\n    End With\r\n \r\n    SystemTimeToFileTime ST, DateToFileTime\r\n    LocalFileTimeToFileTime DateToFileTime, DateToFileTime\r\n \r\nEnd Function\r\n \r\nPrivate Function LargeIntToCurrency(Low As Long, High As Long) As Currency\r\n    Dim LI As LARGE_INTEGER\r\n    LI.LowPart = Low: LI.HighPart = High\r\n    CopyMemory LargeIntToCurrency, LI, LenB(LI)\r\n    LargeIntToCurrency = LargeIntToCurrency * 10000\r\nEnd Function\r\n \r\nPrivate Function CurrencyToLargeInt(ByVal Curr As Currency) As LARGE_INTEGER\r\n    Curr = Curr \/ 10000\r\n    CopyMemory CurrencyToLargeInt, Curr, LenB(Curr)\r\nEnd Function\r\n  \r\nPrivate Function ReplaceFilter(ByVal sFilter As String) As String\r\n    sFilter = Replace(sFilter, &quot;+&quot;, &quot;\\+&quot;)\r\n    sFilter = Replace(sFilter, &quot;.&quot;, &quot;\\.&quot;)\r\n    sFilter = Replace(sFilter, &quot;|&quot;, &quot;\\|&quot;)\r\n    sFilter = Replace(sFilter, &quot;;&quot;, &quot;|\\b&quot;)\r\n    sFilter = Replace(sFilter, &quot; &quot;, &quot;|\\b&quot;)\r\n    sFilter = Replace(sFilter, &quot;{&quot;, &quot;\\{&quot;)\r\n    sFilter = Replace(sFilter, &quot;}&quot;, &quot;\\}&quot;)\r\n    sFilter = Replace(sFilter, &quot;*&quot;, &quot;.+&quot;)\r\n    sFilter = Replace(sFilter, &quot;?&quot;, &quot;.{1}&quot;)\r\n    sFilter = Replace(sFilter, &quot;(&quot;, &quot;\\(&quot;)\r\n    sFilter = Replace(sFilter, &quot;)&quot;, &quot;\\)&quot;)\r\n    sFilter = Replace(sFilter, &quot;^&quot;, &quot;\\^&quot;)\r\n    sFilter = Replace(sFilter, &quot;$&quot;, &quot;\\$&quot;)\r\n    sFilter = Replace(sFilter, &quot;&#x5B;&quot;, &quot;\\&#x5B;&quot;)\r\n    sFilter = Replace(sFilter, &quot;&#x5B;&quot;, &quot;\\]&quot;)\r\n \r\n    Do While InStr(sFilter, &quot;|\\b|\\b&quot;)\r\n        sFilter = Replace$(sFilter, &quot;|\\b|\\b&quot;, &quot;|\\b&quot;)\r\n    Loop \r\n    ReplaceFilter = &quot;^(&quot; &amp; sFilter &amp; &quot;)$|(&quot; &amp; sFilter &amp; &quot;.+)&quot;\r\nEnd Function\r\n \r\nPublic Function GetAllDriveFixed() As String\r\n    Dim sBuff As String * 255\r\n    Dim arrDrive() As String\r\n    Dim i As Long\r\n \r\n    i = GetLogicalDriveStrings(255, sBuff) \r\n    arrDrive = Split(Left$(sBuff, i - 1), Chr$(0))\r\n \r\n    For i = 0 To UBound(arrDrive)\r\n        If GetDriveType(arrDrive(i)) = DRIVE_FIXED Then\r\n            GetAllDriveFixed = GetAllDriveFixed &amp; arrDrive(i) &amp; &quot;; &quot;\r\n        End If\r\n    Next\r\n \r\n    GetAllDriveFixed = Left(GetAllDriveFixed, Len(GetAllDriveFixed) - 2)\r\n \r\nEnd Function\r\n \r\nPrivate Sub Class_Initialize()\r\n    Dim i As Long\r\n \r\n    For i = 0 To 255: aUChars(i) = i: Next\r\n    CharUpperBuffA aUChars(0), 256\r\n \r\n    m_WindowsDir = Environ(&quot;windir&quot;)\r\n    NormalizePath m_WindowsDir\r\n \r\n    m_SearchInSysFolder = True\r\n    m_SearchInSubFolder = True\r\n    m_SearchHidePath = False\r\n    m_IgnoreCase = True\r\n    m_sPath = GetAllDriveFixed\r\nEnd Sub\r\n \r\nPrivate Sub Class_Terminate()\r\n    c_bCancel = True\r\n    Set c_cFolders = Nothing\r\n    Set c_cFiles = Nothing\r\n    Set oRegExp = Nothing\r\n    Set objShell = Nothing\r\nEnd Sub\r\n\r\n<\/pre>\n<\/p>\n<p align=\"center\"><a href=\"https:\/\/leandroascierto.com\/blog\/descarga.php?url=ClsSearch.zip\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" title=\"Descargar\" src=\"https:\/\/leandroascierto.com\/blog\/descarga.php?file=ClsSearch.zip\" alt=\"\" width=\"280\" height=\"61\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta clase sirve para buscar archivos y carpetas, est\u00e1 bien completa ya que podemos aplicar filtros tales como fecha de modificaci\u00f3n, creaci\u00f3n y de \u00faltimo acceso, tambi\u00e9n tama\u00f1o m\u00ednimo y m\u00e1ximo. Cuenta con un filtro en el que podemos indicar con asteriscos ( * ) y signos de interrogaci\u00f3n ( ? ) para lograr una <a href='https:\/\/leandroascierto.com\/blog\/clase-para-buscar\/' class='excerpt-more'>[&#8230;]<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[29],"tags":[90,91,87],"class_list":["post-321","post","type-post","status-publish","format-standard","hentry","category-modulos","tag-findfirstfile","tag-findnextfile","tag-search","category-29-id","post-seq-1","post-parity-odd","meta-position-corners","fix"],"_links":{"self":[{"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/posts\/321","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/comments?post=321"}],"version-history":[{"count":4,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/posts\/321\/revisions"}],"predecessor-version":[{"id":548,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/posts\/321\/revisions\/548"}],"wp:attachment":[{"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/media?parent=321"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/categories?post=321"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/tags?post=321"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}