Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - seba123neo

#221
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 (vb) [Seleccionar]
Option Explicit

Private Const vbDot = 46
Private Const MAXDWORD As Long = &HFFFFFFFF
Private Const MAX_PATH As Long = 260
Private Const INVALID_HANDLE_VALUE = -1
Private Const FILE_ATTRIBUTE_DIRECTORY = &H10

Private Type FILETIME
   dwLowDateTime As Long
   dwHighDateTime As Long
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
   sFileRoot As String
   sFileNameExt As String
   sResult As String
   sMatches As String
   Count As Long
End Type

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

Dim vCarpetas As New Collection

Private Sub Command1_Click()
   Call CarpetaMasProfunda("c:\program files (x86)")
   
   Dim vResult As String
   vResult = ""

   Dim vArr() As String
   Dim vCont As Integer
   Dim i As Integer

   For i = 1 To vCarpetas.Count

       vArr = Split(vCarpetas(i), "\")

       If UBound(vArr) > vCont Then
           vCont = UBound(vArr)
           vResult = vCarpetas(i)
       End If
   Next i
   
   MsgBox vResult
End Sub

Private Sub CarpetaMasProfunda(ByVal pPath As String)

   Dim FP As FILE_PARAMS
   
   With FP
      .sFileRoot = pPath
      .sFileNameExt = "*.*"
      .bRecurse = 1
   End With

   Dim WFD As WIN32_FIND_DATA
   Dim hFile As Long
   Dim sRoot As String
   Dim spath As String
   Dim sTmp As String
   
   sRoot = QualifyPath(FP.sFileRoot)
   spath = sRoot & FP.sFileNameExt

   hFile = FindFirstFile(spath, WFD)

   If hFile <> INVALID_HANDLE_VALUE Then
         
      Do
         
         If (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) And Asc(WFD.cFileName) <> vbDot Then
           
            sTmp = TrimNull(WFD.cFileName)
                       
            FP.Count = FP.Count + 1
            vCarpetas.Add sRoot & sTmp
           
            If FP.bRecurse Then
           
               FP.sFileRoot = sRoot & sTmp
               Call CarpetaMasProfunda(FP.sFileRoot)
           
            End If

         End If
         
      Loop While FindNextFile(hFile, WFD)
     
      hFile = FindClose(hFile)
   End If
End Sub

Private Function TrimNull(pStart As String) As String
   Dim vPos As Integer
   
   vPos = InStr(pStart, Chr$(0))
   
   If vPos Then
      TrimNull = Left$(pStart, vPos - 1)
      Exit Function
   End If
 
   TrimNull = pStart
End Function

Private Function QualifyPath(pPath As String) As String
   If Right$(pPath, 1) <> "\" Then
      QualifyPath = pPath & "\"
   Else
      QualifyPath = pPath
   End If
End Function


saludos.
#222
hasta el dia en que me loguee y me salte error porque no puedo entrar mas , ese dia dejare de usar el messenger, por ahora lo sigo usando, no me gusta skype todavia.
#223
no entiendo porque este post tiene chincheta  :rolleyes:
#224
no uses el objeto Wscript.Shell, es obsoleto en .NET, usa las clases de .NET que ya vienen para acceder al registro.
#225
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.

Código (vb) [Seleccionar]
Option Explicit

Private Function CarpetaMasProfunda(ByVal pPath As String)

    Dim vCarpetas As New Collection
    Dim vNext As Integer
    Dim vDir As String
    Dim vSubDir As String
    Dim vResult As String
   
    vNext = 1
    vCarpetas.Add pPath
   
    Do While vNext <= vCarpetas.Count

        vDir = vCarpetas(vNext)
        vNext = vNext + 1
       
        vSubDir = Dir$(vDir & "\*", vbDirectory)
       
        Do While vSubDir <> ""

            If vSubDir <> "." And vSubDir <> ".." Then
                vSubDir = vDir & "\" & vSubDir
                On Error Resume Next
                If GetAttr(vSubDir) And vbDirectory Then vCarpetas.Add vSubDir
            End If
           
            vSubDir = Dir$(, vbDirectory)
        Loop
    Loop
   
    '---------------------------------------------------------------------

    vResult = ""
   
    Dim vArr() As String
    Dim vCont As Integer
    Dim i As Integer
   
    For i = 1 To vCarpetas.Count
   
        vArr = Split(vCarpetas(i), "\")
       
        If UBound(vArr) > vCont Then
            vCont = UBound(vArr)
            vResult = vCarpetas(i)
        End If
    Next i
   
    CarpetaMasProfunda = vResult
End Function

Private Sub Form_Load()
    MsgBox CarpetaMasProfunda("C:\Program Files")
End Sub


lo probe con una carpeta con 10 mil carpetas adentro y en unos 10 segundos me muestra el path mas largo.

saludos.
#226
Programación General / Re: base de datos sql
11 Enero 2013, 19:17 PM
la verdad yo tampoco entiendo, si queres solo traer un registro hace TOP 1
#227
nunca se deben usar colores de la paleta de sistema, ya que esta cambia a traves de los temas de windows, siempre hay que usar la paleta de coores que se llama "personalizado", esa no cambia, puede que le hayas puesto un color que varie y por eso pasa.
#228
esos buscadores de ip solo buscan de donde es el ISP proveedor que te da internet, por ejemplo a mi ahora me dice que estoy en una ciudad a 500 km de donde estoy realmente.
#229
si, los controles realizados asi que heredan (Inherits), son controles rapidos, pues lo unico que estas haciendo es usar el mismo control de .NET y le estas modificando sus metodos para hacer lo que uno quiera, a mi tambien me gustan ese tipo de controles, pero la verdad no se porque son tan pesados esos packs de controles de esas empresas, y para colmo hay que pagar, ni en pedo pago para que me haga mas lenta la aplicacion  :xD

yo antes tenia este orden de prioridad:

INTERFAZ LINDA - APLICACION RAPIDA

despues cambie a

APLICACION RAPIDA - INTERFAZ LINDA

ya que me encanta primero buscar que las cosas funcionen lo mas rapido posible, luego ver los procesos que tardan mas y si hay posibilidad de optimizarlos. y mientras menos dependencias mejor, que solo sea el .exe y nada mas.
#230
Foro Libre / Re: estoy muy viejo para empezar?
10 Enero 2013, 01:41 AM
Cita de: ~ Yoya ~ en  9 Enero 2013, 22:58 PM
para luego soñar y encontrar la solución. Lo del sueño me ha pasado muchas veces, incluso todavía aveces me pasa.

si el subconciente sigue trabajando, a mi tambien me paso que hasta programaba y pensaba de programar en los sueños, por algo tengo este nick  >:D