comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Buscar archivos en forma avanzada usando funciones API

  • 1 Respuestas
  • 1514 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5331
  • Actividad:
    45%
  • Reputación 30
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« en: Julio 27, 2010, 04:41:11 pm »
Ejemplo que muestra como buscar archivos y directorios mediante algunas funciones del Api

El ejemplo permite buscar archivos incluyendo subdirectorios, también podemos buscar un determinado fichero como también por extenciones, ..como lo hace windows, y utilizando comodines para la búsqueda

Además, la función que busca, retorna el tamaño total en bytes de los ficheros encontrados y el número de directorios o carpetas

Las funciones del Api que se usan son:

* FindFirstFile : busca el primer archivo en el directorio
* FindNextFile : busca el siguiente
* FindClose : Para cuando finaliza la búsqueda de archivos es necesario liberar los recursos
* GetFileAttributes: para los atributos de archivos, en este caso para el tamaño.



Controles para el ejemplo

* Un control textBox llamado Text1 ( para indicar el path donde buscar, por ejemplo c:\carpeta )
* Un control textBox para indicar el archivo o los archivos a buscar ( Puede ser un archivos específico o todos los archivos de una determinada extensión, por ejemplo * .doc, o ... *.*, etc..)
* Agregar en el proyecto un control command1 ( para buscar )
* Añadir un control ListBox llamado List1 para listar los archivos
* Agregar un módulo bas.

Código: Visual Basic
  1. Option Explicit
  2.  
  3.  
  4. '***************************************************************************
  5. '* Código fuente del módulo bas
  6. '***************************************************************************
  7.  
  8.  
  9.  
  10. 'Declaraciones del Api
  11. '------------------------------------------------------------------------------
  12.  
  13. 'Esta función busca el primer archivo de un Dir
  14. Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" ( _
  15. ByVal lpFileName As String, _
  16. lpFindFileData As WIN32_FIND_DATA) As Long
  17.  
  18. 'Esta el siguiente archivo o directorio
  19. Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" ( _
  20. ByVal hFindFile As Long, _
  21. lpFindFileData As WIN32_FIND_DATA) As Long
  22.  
  23. Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" ( _
  24. ByVal lpFileName As String) As Long
  25.  
  26. 'Esta cierra el Handle de búsqueda
  27. Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
  28.  
  29.  
  30. ' Constantes
  31. '------------------------------------------------------------------------------
  32.  
  33. 'Constantes de atributos de archivos
  34. Const FILE_ATTRIBUTE_ARCHIVE = &H20
  35. Const FILE_ATTRIBUTE_DIRECTORY = &H10
  36. Const FILE_ATTRIBUTE_HIDDEN = &H2
  37. Const FILE_ATTRIBUTE_NORMAL = &H80
  38. Const FILE_ATTRIBUTE_READONLY = &H1
  39. Const FILE_ATTRIBUTE_SYSTEM = &H4
  40. Const FILE_ATTRIBUTE_TEMPORARY = &H100
  41.  
  42. 'Otras constantes
  43. Const MAX_PATH = 260
  44. Const MAXDWORD = &HFFFF
  45. Const INVALID_HANDLE_VALUE = -1
  46.  
  47.  
  48. 'UDT
  49. '------------------------------------------------------------------------------
  50.  
  51. 'Estructura para las fechas de los archivos
  52. Private Type FILETIME
  53. dwLowDateTime As Long
  54. dwHighDateTime As Long
  55. End Type
  56.  
  57. 'Estructura necesaria para la información de archivos
  58. Private Type WIN32_FIND_DATA
  59. dwFileAttributes As Long
  60. ftCreationTime As FILETIME
  61. ftLastAccessTime As FILETIME
  62. ftLastWriteTime As FILETIME
  63. nFileSizeHigh As Long
  64. nFileSizeLow As Long
  65. dwReserved0 As Long
  66. dwReserved1 As Long
  67. cFileName As String * MAX_PATH
  68. cAlternate As String * 14
  69. End Type
  70.  
  71.  
  72. '-----------------------------------------------------------------------
  73. 'Funciones
  74. '-----------------------------------------------------------------------
  75.  
  76.  
  77. 'Esta función es para formatear los nombres de archivos y directorios. Elimina los CHR(0)
  78. '------------------------------------------------------------------------
  79. Function Eliminar_Nulos(OriginalStr As String) As String
  80.  
  81. If (InStr(OriginalStr, Chr(0)) > 0) Then
  82. OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
  83. End If
  84. Eliminar_Nulos = OriginalStr
  85.  
  86. End Function
  87.  
  88. 'Esta función es la principal que permite buscar _
  89. los archivos y listarlos en el ListBox
  90.  
  91.  
  92. Function FindFilesAPI(Path As String, _
  93. SearchStr As String, _
  94. FileCount As Long, _
  95. DirCount As Long, _
  96. ListBox As ListBox)
  97.  
  98.  
  99. Dim FileName As String
  100. Dim DirName As String
  101. Dim dirNames() As String
  102. Dim nDir As Long
  103. Dim i As Long
  104. Dim hSearch As Long
  105. Dim WFD As WIN32_FIND_DATA
  106. Dim Cont As Long
  107.  
  108.  
  109. If Right(Path, 1) <> "\" Then Path = Path & "\"
  110. ' Buscamos por mas directorios
  111. nDir = 0
  112. ReDim dirNames(nDir)
  113. Cont = True
  114. hSearch = FindFirstFile(Path & "*", WFD)
  115. If hSearch <> INVALID_HANDLE_VALUE Then
  116. Do While Cont
  117. DirName = Eliminar_Nulos(WFD.cFileName)
  118. ' Ignore the current and encompassing directories.
  119. If (DirName <> "." And (DirName <> ".." Then
  120. ' Check for directory with bitwise comparison.
  121. If GetFileAttributes(Path & DirName) _
  122. And FILE_ATTRIBUTE_DIRECTORY Then
  123.  
  124. dirNames(nDir) = DirName
  125. DirCount = DirCount + 1
  126. nDir = nDir + 1
  127. ReDim Preserve dirNames(nDir)
  128.  
  129. End If
  130. End If
  131. Cont = FindNextFile(hSearch, WFD) 'Get next subdirectory.
  132. Loop
  133.  
  134. Cont = FindClose(hSearch)
  135.  
  136. End If
  137.  
  138. hSearch = FindFirstFile(Path & SearchStr, WFD)
  139. Cont = True
  140. If hSearch <> INVALID_HANDLE_VALUE Then
  141. While Cont
  142. FileName = Eliminar_Nulos(WFD.cFileName)
  143. If (FileName <> "." And (FileName <> ".." Then
  144. FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) _
  145. + WFD.nFileSizeLow
  146. FileCount = FileCount + 1
  147. ListBox.AddItem Path & FileName
  148. End If
  149. Cont = FindNextFile(hSearch, WFD) ' Get next file
  150. Wend
  151. Cont = FindClose(hSearch)
  152. End If
  153.  
  154. ' Si estos son Sub Directorios......
  155. If nDir > 0 Then
  156.  
  157. For i = 0 To nDir - 1
  158. FindFilesAPI = FindFilesAPI + FindFilesAPI(Path & dirNames(i) & "\", _
  159. SearchStr, FileCount, DirCount, ListBox)
  160. Next i
  161. End If
  162. End Function
« Última modificación: Mayo 12, 2014, 03:27:33 pm por Expermicid »


Ignaro mayor de BsAs

  • *
  • Visitante
« Respuesta #1 en: Julio 28, 2010, 12:40:43 am »
Gracias, Antrax. Esto es de mucha utilidad.

 

¿Te gustó el post? COMPARTILO!



Abrir la caja de dialogo de Abrir con selección multiple de archivos(API)

Iniciado por ANTRAX

Respuestas: 0
Vistas: 1839
Último mensaje Julio 26, 2010, 12:17:09 pm
por ANTRAX
Borrar archivos temporales, cookies, etc

Iniciado por ANTRAX

Respuestas: 2
Vistas: 4181
Último mensaje Noviembre 27, 2011, 01:59:39 am
por Bic
Ejecutar Cualquier tipo de Archivos

Iniciado por ANTRAX

Respuestas: 1
Vistas: 1553
Último mensaje Julio 26, 2010, 12:50:40 pm
por _katze_
Cómo descargar archivos de Internet

Iniciado por ANTRAX

Respuestas: 1
Vistas: 1731
Último mensaje Julio 27, 2010, 12:24:46 pm
por _katze_
Modulo Tratamiento de archivos

Iniciado por alexander1712

Respuestas: 0
Vistas: 2764
Último mensaje Enero 26, 2013, 12:56:47 pm
por alexander1712