Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: Psyke1 en Noviembre 26, 2012, 06:36:43 am

Título: Enumerar carpetas de una carpeta compartida
Publicado por: Psyke1 en Noviembre 26, 2012, 06:36:43 am
Me estoy volviendo loco... :huh:
Necesito extraer todas las carpetas que contenga la carpeta compartida "\\micarpeta\".
Tan sólo para saber si existe ya he tenido problemas puesto que devuelve false utilizando métodos tradicionales. Eso lo he solucionado con api PathIsNetworkPath().

En cambio puedo listar las carpetas de una subcarpeta suya:
Código: (vb) [Seleccionar]
Private Sub Form_Load()
    Dim f As Object, s
   
    Set f = CreateObject("Scripting.FileSystemObject")
   
    For Each s In f.GetFolder("\\micarpeta\hola").SubFolders
        MsgBox s
    Next
End Sub

He encontrado los apis WNetEnumResource(), WNetOpenEnum(), WNetCloseEnum(), WNetOpenEnum().
Código: [Seleccionar]
http://allapi.mentalis.org/apilist/2AA74BB4AC857C52AD4BC7FA9E4DB1B7.html
Pero es extremaaaaaadamente lento... :(
Así que me comprometo a levantar un monumento a quién me sepa guiar/dar una solución. :-*

DoEvents! :P
Título: Re:Enumerar carpetas de una carpeta compartida
Publicado por: raul338 en Noviembre 26, 2012, 10:17:56 am
Probaste si haciendo directamente desde el explorer es lento?
Título: Re:Enumerar carpetas de una carpeta compartida
Publicado por: E N T E R en Noviembre 26, 2012, 10:41:04 am
No te sirve asi, comproba si un archivo existe dentro de una carpeta compartida.

Como Referencia: Microsoft Scripting Runtime

Código: (VB) [Seleccionar]
Private Sub Command1_Click()
   
    Dim objFSO As New FileSystemObject
   
    If objFSO.FileExists("\\CENTRAL\FOLDER\archivo.txt") Then
        Debug.Print "existe"
    Else
        Debug.Print "no existe"
    End If
   
End Sub
Título: Re:Enumerar carpetas de una carpeta compartida
Publicado por: Psyke1 en Noviembre 26, 2012, 12:11:06 pm
@raul
Qué va, de ese modo es instantáneo.

Me puse a mirar el código de allapi (http://allapi.mentalis.org/apilist/2AA74BB4AC857C52AD4BC7FA9E4DB1B7.html) y mira:
Código: (vb) [Seleccionar]
Private Const RESOURCE_ENUM_ALL As Long = &HFFFFDa una cantidad de vueltas brutal... D;

@Enter
Me temo que eso no es lo que busco, amigo.

DoEvents! :P
Título: Re:Enumerar carpetas de una carpeta compartida
Publicado por: LeandroA en Noviembre 26, 2012, 02:54:33 pm
Hola Psykey, no tengo para provarlo en red, ya que soy duro para aprenderlo  XD, pero fijate si con el objeto Shell es mas rapido, en teoría es igual que el explorer.

Código: (VB) [Seleccionar]
Option Explicit

Private Sub Form_Load()
    Dim oShell As Object
    Dim OrigItem As Object
    Dim DestItem As Object
   
    Set oShell = CreateObject("Shell.Application")
   
    For Each OrigItem In oShell.NameSpace(CVar("\\PC\Mi música")).Items
        Debug.Print OrigItem.Name
    Next

End Sub

Saludos.
Título: Re:Enumerar carpetas de una carpeta compartida
Publicado por: Psyke1 en Noviembre 26, 2012, 03:04:24 pm
¡Funciona! :o

Gracias
Jajajajajaja ¡TE ODIO!  >:(  ;D

Mira lo que había hecho:
Código: [Seleccionar]
http://foro.elhacker.net/programacion_visual_basic/src_getsharesubfolders-t377004.0.html;msg1804532#msg1804532
¬¬"!



EDIT:
Añadí una función utilizando tu método.  :)

DoEvents! :P
Título: Re:Enumerar carpetas de una carpeta compartida
Publicado por: LeandroA en Noviembre 26, 2012, 03:24:25 pm
jaj, pero igual es con api, no es malo, lo que si (repito no estoy muy ducho con la red) pero no me lista "\\PC\Mi música" supongo que deveria no, eso es la compartida de mi pc

Saludos.
Título: Re:Enumerar carpetas de una carpeta compartida
Publicado por: Psyke1 en Noviembre 26, 2012, 03:31:47 pm
Hubo una errata al plantear mi duda, puse "carpeta compartida"... cuando en realidad me refería al "servidor local".

En el ejemplo que pones de \\PC\Mi música en teoría se puede sacar con FSO (por ejemplo) puesto que a las subcarpetas sí te deja acceder...

Yo tan sólo quería listar todas las carpetas de \\PC.  ::)

DoEvents! :P

Título: Re:Enumerar carpetas de una carpeta compartida
Publicado por: LeandroA en Noviembre 26, 2012, 03:53:57 pm
bien, hay un error si pones cualquier nombre por ejemplo  "\\asdfsdf"  PathIsNetworkPath()  lo hacepta por las \\ pero en realidad no existe ese path   abria que poner on error goto o verificar si oShell.NameSpace(CVar(sServer)) is nothing, otra cosa podes poner oItem.Path en ves de cocatenar
sServer & oItem.Name

saludos.
Título: Re:Enumerar carpetas de una carpeta compartida
Publicado por: Psyke1 en Noviembre 26, 2012, 04:38:08 pm
Gracias, se me había escapado, no había caído que PathIsNetworkPath() trabajaba igual que PathIsDirectory().  :P
Ahora voy a buscar una alternativa para mi código con API.

DoEvents! :P


EDIT:
Encontré un inconveniente a tu modo de hacerlo: tarda demasiado si pones un servidor inexistente. Así que valió la pena hacer mi versión Api. :P

DoEvents! :P