Búsqueda de archivos usando el Api FindFirstFile y FindNextF
Página 1 de 1.
Búsqueda de archivos usando el Api FindFirstFile y FindNextF
Este ejemplo muestra como buscar un archivo o directorio pero recorriendo todos sus subdirectorios internos, por ejemplo si ponemos buscar *.* en la unidad "c:" no va a buscar solo en esta unidad, si no que lo va a hacer en toda la partición c:.
Este ejemplo similar , lo que hace es exactamente lo mismo que hace la función Dir del Visual basic , pero de forma mas veloz, claro que esto se nota cuando los archivos son numerosos, pero en comparación con el otro ejemplo vuelvo a aclarar, este ejemplo solo lista los ficheros del directorio seleccionado sin incluir los subdirectorios.
Controles para el form
* Colocar un Drive1
* un Dir1
* un List1
* un Command1 de esta forma:
Ya con este código tienen el programa que ver en la imagen.
Este ejemplo similar , lo que hace es exactamente lo mismo que hace la función Dir del Visual basic , pero de forma mas veloz, claro que esto se nota cuando los archivos son numerosos, pero en comparación con el otro ejemplo vuelvo a aclarar, este ejemplo solo lista los ficheros del directorio seleccionado sin incluir los subdirectorios.
Controles para el form
* Colocar un Drive1
* un Dir1
* un List1
* un Command1 de esta forma:
- Código:
'Declaración de las funciones Api para buscar archivos en el sistema
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Api FindFirstFile (Busca el primer archivo)
Private Declare Function FindFirstFile _
Lib "kernel32" _
Alias "FindFirstFileA" ( _
ByVal lpFileName As String, _
lpFindFileData As WIN32_FIND_DATA) As Long
'Api FindNextFile (busca el siguiente)
Private Declare Function FindNextFile _
Lib "kernel32" _
Alias "FindNextFileA" ( _
ByVal hFindFile As Long, _
lpFindFileData As WIN32_FIND_DATA) As Long
'Api GetFileAttributes (para recuperar los atributos de los archivos)
Private Declare Function GetFileAttributes _
Lib "kernel32" _
Alias "GetFileAttributesA" ( _
ByVal lpFileName As String) As Long
Private Declare Function FindClose _
Lib "kernel32" ( _
ByVal hFindFile As Long) As Long
'Constantes para la búsqueda que utiliza las funciones Api anteriores
Const MAX_PATH = 260
Const MAXDWORD = &HFFFF
Const INVALID_HANDLE_VALUE = -1
Const FILE_ATTRIBUTE_ARCHIVE = &H20
Const FILE_ATTRIBUTE_DIRECTORY = &H10
Const FILE_ATTRIBUTE_HIDDEN = &H2
Const FILE_ATTRIBUTE_NORMAL = &H80
Const FILE_ATTRIBUTE_READONLY = &H1
Const FILE_ATTRIBUTE_SYSTEM = &H4
Const FILE_ATTRIBUTE_TEMPORARY = &H100
'Estructura que utiliza la estructura WIN32_FIND_DATA
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
'Estructura WIN32_FIND_DATA para info de archivos
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
''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Función que elimina los caracteres nulos en los path devueltos
Private Function EliminarNull(OriginalStr As String) As String
If (InStr(OriginalStr, Chr(0)) > 0) Then
OriginalStr = Left(OriginalStr, _
InStr(OriginalStr, Chr(0)) - 1)
End If
EliminarNull = OriginalStr
End Function
'Función que busca y lista los ficheros
Private Sub Buscar(path As String)
Dim FileName As String ' nombre de Archivos
Dim DirName As String ' Subdirectorios
Dim hSearch As Long ' Handle de busqueda
Dim WFD As WIN32_FIND_DATA
Dim Cont As Integer
'si no tiene la barra separadora de path se la ponemos
If Right(path, 1) <> "" Then path = path & ""
'Esta variable es para saber cuando buscamos
'con el Api si hay un archivo, si en el bucle ya
'no encuentra mas, la Api devuelve un 0
Cont = True
'Buscamos el primer archivo o directorio del Path
hSearch = FindFirstFile(path & "*", WFD)
'Si no hay nada el handle de busqueda vale -1
If hSearch <> INVALID_HANDLE_VALUE Then
'Mientras Cont valga 1 seguirá buscando ya que hay archivos o directorios
Do While Cont
DirName = EliminarNull(WFD.cFileName)
' ignoramos los "." y ".."
If (DirName <> ".") And (DirName <> "..") Then
' Si es un directorio
If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
List1.AddItem DirName
'Si no es un archivo
Else
List1.AddItem DirName
End If
End If
'Siguiente archivo o directorio
Cont = FindNextFile(hSearch, WFD) 'Get next subdirectory.
Loop
'Cerramos el handle de búsqueda
Cont = FindClose(hSearch)
End If
End Sub
Private Sub Command1_Click()
'Borramos el contenido del List por si tenia items
List1.Clear
'Buscamos pasandole el path del control Dir1
Buscar Dir1
End Sub
Private Sub Drive1_Change()
Dir1 = Drive1
End Sub
Ya con este código tienen el programa que ver en la imagen.
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.