elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [RETO] Ruta más oculta
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: [RETO] Ruta más oculta  (Leído 6,886 veces)
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: [RETO] Ruta más oculta
« Respuesta #10 en: 12 Enero 2013, 20:53 pm »

Ojo dependiendo el método la función puede ser mas rápida la segunda vez que se ejecuta, por lo tanto debe medirse en varios bucles.

esta es la mia
Código
  1. Option Explicit
  2. Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
  3. Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
  4. Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
  5. Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
  6.  
  7. Private Const MAX_PATH                  As Long = 260
  8. Private Const INVALID_HANDLE_VALUE      As Long = -1
  9.  
  10. Private Type FILETIME
  11.    dwLowDateTime As Long
  12.    dwHighDateTime As Long
  13. End Type
  14.  
  15. Private Type WIN32_FIND_DATA
  16.    dwFileAttributes As Long
  17.    ftCreationTime As FILETIME
  18.    ftLastAccessTime As FILETIME
  19.    ftLastWriteTime As FILETIME
  20.    nFileSizeHigh As Long
  21.    nFileSizeLow As Long
  22.    dwReserved0 As Long
  23.    dwReserved1 As Long
  24.    cFileName As String * MAX_PATH
  25.    cAlternate As String * 14
  26. End Type
  27.  
  28. Private c_cFolders  As Collection
  29. Private m_Max As Long
  30.  
  31. Public Function GetLastFolder(ByVal sStartPath As String) As Collection
  32.    m_Max = 0
  33.    Set c_cFolders = New Collection
  34.    sStartPath = IIf(Right$(sStartPath, 1) = "\", sStartPath, sStartPath & "\")
  35.    pvFindFolders sStartPath, 0
  36.    Set GetLastFolder = c_cFolders
  37. End Function
  38.  
  39.  
  40. Private Sub pvFindFolders(sPath As String, lMax As Long)
  41.  
  42.    Dim lRet                As Long
  43.    Dim lhSearch            As Long
  44.    Dim tWFD                As WIN32_FIND_DATA
  45.    Dim svDirs()            As String
  46.    Dim lCount              As Long
  47.    Dim sDir                As String
  48.    Dim i                   As Long
  49.    Dim sFolder             As String
  50.  
  51.    lhSearch = FindFirstFile(sPath & "*", tWFD)
  52.  
  53.    If Not lhSearch = INVALID_HANDLE_VALUE Then
  54.  
  55.        Do
  56.            If (tWFD.dwFileAttributes And vbDirectory) = vbDirectory Then
  57.  
  58.                sFolder = Left$(tWFD.cFileName, lstrlen(tWFD.cFileName))
  59.                If InStrB(sFolder, ".") <> 1 Then
  60.                    sDir = sPath & sFolder
  61.  
  62.                    ReDim Preserve svDirs(lCount)
  63.                    svDirs(lCount) = sDir & "\"
  64.                    lCount = lCount + 1
  65.  
  66.                    If lMax > m_Max Then
  67.                        m_Max = lMax
  68.                        Set c_cFolders = New Collection
  69.                        Call c_cFolders.Add(sDir)
  70.                    ElseIf lMax = m_Max Then
  71.                        Call c_cFolders.Add(sDir)
  72.                    End If
  73.  
  74.                End If
  75.            End If
  76.  
  77.            lRet = FindNextFile(lhSearch, tWFD)
  78.        Loop While lRet
  79.  
  80.        Call FindClose(lhSearch)
  81.  
  82.  
  83.        For i = 0 To lCount - 1
  84.            Call pvFindFolders(svDirs(i), lMax + 1)
  85.        Next
  86.  
  87.    End If
  88.  
  89. End Sub
  90.  


Código
  1. Option Explicit
  2.  
  3. Private Sub Form_Load()
  4.    Dim cColl As Collection
  5.    Dim i As Long
  6.  
  7.    Set cColl = GetLastFolder("C:\Users\Windows\")
  8.  
  9.    For i = 1 To cColl.Count
  10.        Debug.Print cColl(i)
  11.    Next
  12. End Sub


« Última modificación: 12 Enero 2013, 20:55 pm por LeandroA » En línea

seba123neo
Moderador
***
Desconectado Desconectado

Mensajes: 3.621



Ver Perfil WWW
Re: [RETO] Ruta más oculta
« Respuesta #11 en: 12 Enero 2013, 20:54 pm »

aca va otra forma, igual a la que usa Dir$ que puse antes, pero esta es recursiva y usa apis, lo cual es muchisimo mas rapida.

la anterior funcion me tarda 7 segundos en escanear la carpeta de program files de mi pc (que tiene 7 mil carpetas), esta solo tarda 1 segundo  y a veces menos :xD.

Código
  1. Option Explicit
  2.  
  3. Private Const vbDot = 46
  4. Private Const MAXDWORD As Long = &HFFFFFFFF
  5. Private Const MAX_PATH As Long = 260
  6. Private Const INVALID_HANDLE_VALUE = -1
  7. Private Const FILE_ATTRIBUTE_DIRECTORY = &H10
  8.  
  9. Private Type FILETIME
  10.   dwLowDateTime As Long
  11.   dwHighDateTime As Long
  12. End Type
  13.  
  14. Private Type WIN32_FIND_DATA
  15.   dwFileAttributes As Long
  16.   ftCreationTime As FILETIME
  17.   ftLastAccessTime As FILETIME
  18.   ftLastWriteTime As FILETIME
  19.   nFileSizeHigh As Long
  20.   nFileSizeLow As Long
  21.   dwReserved0 As Long
  22.   dwReserved1 As Long
  23.   cFileName As String * MAX_PATH
  24.   cAlternate As String * 14
  25. End Type
  26.  
  27. Private Type FILE_PARAMS
  28.   bRecurse As Boolean
  29.   sFileRoot As String
  30.   sFileNameExt As String
  31.   sResult As String
  32.   sMatches As String
  33.   Count As Long
  34. End Type
  35.  
  36. Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
  37. Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
  38. Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
  39.  
  40. Dim vCarpetas As New Collection
  41.  
  42. Private Sub Command1_Click()
  43.   Call CarpetaMasProfunda("c:\program files (x86)")
  44.  
  45.   Dim vResult As String
  46.   vResult = ""
  47.  
  48.   Dim vArr() As String
  49.   Dim vCont As Integer
  50.   Dim i As Integer
  51.  
  52.   For i = 1 To vCarpetas.Count
  53.  
  54.       vArr = Split(vCarpetas(i), "\")
  55.  
  56.       If UBound(vArr) > vCont Then
  57.           vCont = UBound(vArr)
  58.           vResult = vCarpetas(i)
  59.       End If
  60.   Next i
  61.  
  62.   MsgBox vResult
  63. End Sub
  64.  
  65. Private Sub CarpetaMasProfunda(ByVal pPath As String)
  66.  
  67.   Dim FP As FILE_PARAMS
  68.  
  69.   With FP
  70.      .sFileRoot = pPath
  71.      .sFileNameExt = "*.*"
  72.      .bRecurse = 1
  73.   End With
  74.  
  75.   Dim WFD As WIN32_FIND_DATA
  76.   Dim hFile As Long
  77.   Dim sRoot As String
  78.   Dim spath As String
  79.   Dim sTmp As String
  80.  
  81.   sRoot = QualifyPath(FP.sFileRoot)
  82.   spath = sRoot & FP.sFileNameExt
  83.  
  84.   hFile = FindFirstFile(spath, WFD)
  85.  
  86.   If hFile <> INVALID_HANDLE_VALUE Then
  87.  
  88.      Do
  89.  
  90.         If (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) And Asc(WFD.cFileName) <> vbDot Then
  91.  
  92.            sTmp = TrimNull(WFD.cFileName)
  93.  
  94.            FP.Count = FP.Count + 1
  95.            vCarpetas.Add sRoot & sTmp
  96.  
  97.            If FP.bRecurse Then
  98.  
  99.               FP.sFileRoot = sRoot & sTmp
  100.               Call CarpetaMasProfunda(FP.sFileRoot)
  101.  
  102.            End If
  103.  
  104.         End If
  105.  
  106.      Loop While FindNextFile(hFile, WFD)
  107.  
  108.      hFile = FindClose(hFile)
  109.   End If
  110. End Sub
  111.  
  112. Private Function TrimNull(pStart As String) As String
  113.   Dim vPos As Integer
  114.  
  115.   vPos = InStr(pStart, Chr$(0))
  116.  
  117.   If vPos Then
  118.      TrimNull = Left$(pStart, vPos - 1)
  119.      Exit Function
  120.   End If
  121.  
  122.   TrimNull = pStart
  123. End Function
  124.  
  125. Private Function QualifyPath(pPath As String) As String
  126.   If Right$(pPath, 1) <> "\" Then
  127.      QualifyPath = pPath & "\"
  128.   Else
  129.      QualifyPath = pPath
  130.   End If
  131. End Function

saludos.


En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [RETO] Ruta más oculta
« Respuesta #12 en: 14 Enero 2013, 21:59 pm »

Para aumentar la velocidad deberíais llamar a FindFirstFileEx() usando estos flags:
Código
  1. hFind = FindFirstFileEx(path, FindExInfoBasic, pCurrent, FindExSearchLimitToDirectories, NULL, FIND_FIRST_EX_LARGE_FETCH);

Aunque FindExInfoBasic y FIND_FIRST_EX_LARGE_FETCH sólo sirven de W$>Vista aumentarán mucho la velocidad en llamadas recurrentes. Y con FindExSearchLimitToDirectories también aunque tiene que ser cierta versión de NTFS...

Yo hice una vez algo similar en C++ pero no he conseguido encontrar el código :laugh:
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Ruta más oculta
« Respuesta #13 en: 14 Enero 2013, 22:26 pm »

pues aca te pongo algo simple con Dir$, no creo que sea lo mas rapido, seguro alguna recursiva podra ser mas veloz, como con FSO, pero por lo menos cumple el objetivo.

Creo que querías decir iterativa, la recursividad es lenta...

A reinstalar VB6 canijo!¡.

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: [RETO] Ruta más oculta
« Respuesta #14 en: 15 Enero 2013, 01:57 am »

Si es verdad FindFirstFileEx es un poco mas rapida, almenos vajo W7 o W8 aqui para que prueben, la diferencia se nota si utilizan las flags FindExInfoBasic  o FindExInfoStandard, la primera hace que la funcion no rellene  cAlternate de la extructura WIN32_FIND_DATA, con lo cual hace que sea has rapida.

Código
  1. Option Explicit
  2. Private Declare Function FindFirstFileEx Lib "kernel32.dll" Alias "FindFirstFileExA" (ByVal lpFileName As String, ByVal fInfoLevelId As FINDEX_INFO_LEVELS, lpFindFileData As WIN32_FIND_DATA, ByVal fSearchOp As FINDEX_SEARCH_OPS, ByRef lpSearchFilter As Any, ByVal dwAdditionalFlags As Long) As Long
  3. Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
  4. Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
  5. Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
  6. Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
  7. Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
  8. Private Declare Function GetVersion Lib "kernel32.dll" () As Long
  9.  
  10. Private Const MAX_PATH                  As Long = 260
  11. Private Const INVALID_HANDLE_VALUE      As Long = -1
  12.  
  13. Private Type FILETIME
  14.    dwLowDateTime As Long
  15.    dwHighDateTime As Long
  16. End Type
  17.  
  18. Private Type WIN32_FIND_DATA
  19.    dwFileAttributes As Long
  20.    ftCreationTime As FILETIME
  21.    ftLastAccessTime As FILETIME
  22.    ftLastWriteTime As FILETIME
  23.    nFileSizeHigh As Long
  24.    nFileSizeLow As Long
  25.    dwReserved0 As Long
  26.    dwReserved1 As Long
  27.    cFileName As String * MAX_PATH
  28.    cAlternate As String * 14
  29. End Type
  30.  
  31. Private Enum FINDEX_INFO_LEVELS
  32.    FindExInfoStandard
  33.    FindExInfoBasic
  34.    FindExInfoMaxInfoLevel
  35. End Enum
  36.  
  37. Private Enum FINDEX_SEARCH_OPS
  38.    FindExSearchNameMatch
  39.    FindExSearchLimitToDirectories
  40.    FindExSearchLimitToDevices
  41.    FindExSearchMaxSearchOp
  42. End Enum
  43.  
  44. 'FIND FLAGS
  45. Private Const FIND_FIRST_EX_CASE_SENSITIVE = 0
  46. Private Const FIND_FIRST_EX_LARGE_FETCH = 2
  47.  
  48. Private c_cFolders  As Collection
  49. Private m_Max As Long
  50. Private m_IsW7OrLater As Boolean
  51.  
  52. Public Function GetLastFolder(ByVal sStartPath As String) As Collection
  53.    Dim lR As Long
  54.  
  55.    lR = GetVersion
  56.    If ((lR And &HFF) > 5) And (((lR And &HFF00&) \ &H100) > 0) Then m_IsW7OrLater = True
  57.    m_Max = 0
  58.    Set c_cFolders = New Collection
  59.    sStartPath = IIf(Right$(sStartPath, 1) = "\", sStartPath, sStartPath & "\")
  60.    pvFindFolders sStartPath, 0
  61.    Set GetLastFolder = c_cFolders
  62. End Function
  63.  
  64.  
  65. Private Sub pvFindFolders(sPath As String, lMax As Long)
  66.  
  67.    Dim lRet                As Long
  68.    Dim lhSearch            As Long
  69.    Dim tWFD                As WIN32_FIND_DATA
  70.    Dim svDirs()            As String
  71.    Dim lCount              As Long
  72.    Dim sDir                As String
  73.    Dim i                   As Long
  74.    Dim sFolder             As String
  75.  
  76.  
  77.    If m_IsW7OrLater Then
  78.        lhSearch = FindFirstFileEx(sPath & "*", FindExInfoBasic, tWFD, FindExSearchNameMatch, 0&, FIND_FIRST_EX_LARGE_FETCH)
  79.    Else
  80.        lhSearch = FindFirstFileEx(sPath & "*", FindExInfoStandard, tWFD, FindExSearchNameMatch, 0&, FIND_FIRST_EX_CASE_SENSITIVE)
  81.    End If
  82.    'lhSearch = FindFirstFile(sPath & "*", tWFD)
  83.  
  84.    If Not lhSearch = INVALID_HANDLE_VALUE Then
  85.  
  86.        Do
  87.            If (tWFD.dwFileAttributes And vbDirectory) = vbDirectory Then
  88.  
  89.                sFolder = Left$(tWFD.cFileName, lstrlen(tWFD.cFileName))
  90.                If InStrB(sFolder, ".") <> 1 Then
  91.                    sDir = sPath & sFolder
  92.  
  93.                    ReDim Preserve svDirs(lCount)
  94.                    svDirs(lCount) = sDir & "\"
  95.                    lCount = lCount + 1
  96.  
  97.                    If lMax > m_Max Then
  98.                        m_Max = lMax
  99.                        Set c_cFolders = New Collection
  100.                        Call c_cFolders.Add(sDir)
  101.                    ElseIf lMax = m_Max Then
  102.                        Call c_cFolders.Add(sDir)
  103.                    End If
  104.  
  105.                End If
  106.            End If
  107.  
  108.            lRet = FindNextFile(lhSearch, tWFD)
  109.        Loop While lRet
  110.  
  111.        Call FindClose(lhSearch)
  112.  
  113.  
  114.        For i = 0 To lCount - 1
  115.            Call pvFindFolders(svDirs(i), lMax + 1)
  116.        Next
  117.  
  118.    End If
  119.  
  120. End Sub
  121.  
  122.  
  123.  
  124. Private Sub Form_Load()
  125.    Dim cColl As Collection
  126.    Dim i As Long
  127.    Dim T As Long
  128.  
  129.    T = GetTickCount
  130.    Set cColl = GetLastFolder("C:\Users\Windows\")
  131.    Debug.Print GetTickCount - T
  132.  
  133.    For i = 1 To cColl.Count
  134.        Debug.Print cColl(i)
  135.    Next
  136. End Sub
  137.  
« Última modificación: 15 Enero 2013, 02:04 am por LeandroA » En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [RETO] Ruta más oculta
« Respuesta #15 en: 15 Enero 2013, 15:19 pm »

@LeandroA: Si filtras las carpetas que contengan un punto vas a quitar varias carpetas a parte de las relativas "." y "..". Como (en mi caso) .ssh, .designer...
Por cierto, tal y como tienes el código sería fácil hacer la búsqueda de forma iterativa en lugar de recursiva... ¿No sería mucho más rápido?
En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: [RETO] Ruta más oculta
« Respuesta #16 en: 15 Enero 2013, 18:51 pm »

Hola Karcrack, en principio pense que no se podia crear una carpeta con un punto por delante, almenos el explorer de windows no te deja, ahora que lo mencionas cree una carpeta con el vb y si se pude, asi que si hay que modificar ese filtro
no entiendo la diferncia de  iterativa a recursiva, como seria iterativa?

Saludos.
En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.518


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: [RETO] Ruta más oculta
« Respuesta #17 en: 15 Enero 2013, 18:54 pm »

La carpeta (o directorio) "." es la carpeta actual.

Si haces en un cmd un "dir .", es lo mismo que hacer solo "dir": Lista el contenido del directorio actual.
En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [RETO] Ruta más oculta
« Respuesta #18 en: 15 Enero 2013, 19:14 pm »

@LeandroA: Sin llamarte a ti mismo. Haciendo otro bucle antes de FindFirstFileEx cambiando sPath y lMax :-\

Las carpetas empezando por "." son muy comunes en %APPDATA% o %USERPROFILE%. Muchas aplicaciones las crean.
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Mostrar carpeta oculta sin saber la ruta (chflags hidden)
Mac OS X
brank87 2 5,793 Último mensaje 12 Septiembre 2010, 19:28 pm
por putus
los reto a un reto muy dificil
Desafíos - Wargames
elshaker 2 4,615 Último mensaje 2 Enero 2013, 00:12 am
por kaiserr
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines