Newsgroup: it.comp.lang.visual-basic
Titolo: [visual basic] Scarico file via FTP

Ciao a tutti,
ho un problema con un programma da me sviluppato in Visual Basic 6.0.
Devo scaricare da una cartella FTP tutti i file presenti.
Come posso fare?
Ho provato con il componente Inet di Visual Basic ma posso fare un
file alla volta e devo specificare il nome.
Io non so il nome ma devo scaricare tutti i file presenti.
Grazie in anticipo.
Giulia

 ha scritto nel messaggio
news:c1aec230.0504...@posting.google.com...

Tramite il metodo Execute puoi inviare il comando "DIR" (la cui funzione è
intuitiva) al server FTP.
La risposta del server FTP può poi essere ricevuta nell'evento _StateChanged.
In base ad essa ti costruisci la lista dei file presenti nella cartella FTP.
A questo punto, avendo la lista, dovrebbe essere semplice scaricarli uno ad uno.
Bye
Raf

 Raf
Ciao, grazie 1000 per il tuo aiuto.
Mi puoi dare ancora qualche informazione su DIR non riesco ad usarlo.
Questo è il mio codice
    Inet1.url = "..."
    Inet1.UserName = "..."
    Inet1.Password = "..."
    Inet1.Execute Execute, "DIR *.* C:\miacartella"
ma mi da errore.
Come faccio a ciclare sui dati che mi vengono restituiti?
Grazie

 Come faccio a ciclare sui dati che mi vengono restituiti?
Devi ricevere e interpretare la risposta al comando mediante l'evento
StateChanged del controllo INet e il metodo GetChunk.
Una volta che hai raccolto la risposta a DIR, dovresti scandire la stringa
ricevuta (ad esempio popolando un array con i nomi dei file restituiti usando
Split) e ciclare effettuando una GET per ciascun file da downloadare.
Ti suggerisco vivamente di dare un'occhiata alla guida di VB per quanto riguarda
il controllo INet:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon98/html/vbconusinginternettransfercontrol.asp
Buon lavoro!
Raf

Ciao, grazie ancora per la tua disponibilità. Ho letto il documento e
modificato il codice come segue:
    Inet1.url = "
ftp://ftp.
...."
    Inet1.UserName = "...."
    Inet1.Password = "....."
    Inet1.Execute , "DIR /GIULIA/*.*"
    Do While Inet1.StillExecuting
        DoEvents
    Loop
utilizzando anche l'evento StateChanged.
Il problema che come State mi genera solo 1 e 5 e quindi non riesco a
prelevare i dati come da te suggerito.
Sai darmi qualche indicazione?
Grazie

 ha scritto nel messaggio
news:1115208324.7...@o13g2000cwo.googlegroups.com...




Hai controllato nella guida che significato hanno i valori 1 e 5?
icHostResolvingHost = 1 = "The control is looking up the IP address of the
specified host computer"
icRequesting = 5 = "The control is sending a request to the host computer"
Mi sembra strano che tu non riceva eventi corrispondenti ad altri valori, prova
ad aggiungere questo pezzo di codice nell'evento StateChanged:
    Dim Status As String
        Select Case State
        Case icNone
            Status = ""
        Case icResolvingHost
            Status = "Resolving host..."
        Case icHostResolved
            Status = "Host resolved!"
        Case icConnecting
            Status = "Connecting..."
        Case icConnected
            Status = "Connected!"
        Case icRequesting
            Status = "Requesting..."
        Case icRequestSent
            Status = "Request sent!"
        Case icReceivingResponse
            Status = "Receiving response..."
        Case icResponseReceived
            Status = "Response received!"
        Case icDisconnecting
            Status = "Disconnecting..."
        Case icDisconnected
            Status = "Disconnected"
        Case icError
            Status = "Error: " & Inet1.ResponseInfo
        Case icResponseCompleted
            Status = "Response completed!"
        End Select
        Debug.Print Status
Poi verifica nella finestra di debug qual è la sequenza degli eventi.
Ciao
Raf

Ciao,
ho dovuto modificare i parametri per la connessione al sito come segue:
    Inet1.url = "
ftp://ftp.xxx.it/xxx/GIULIA
"
    Inet1.UserName = "user"
    Inet1.Password = "prova"
    Inet1.Execute , "DIR /*.*"
ma il getchunk non mi restituisce nulla...
o meglio sembra che restituisce i caratteri di "a capo" (|)
Nella cartella GIULIA ho due files uno .txt e uno .doc.
Scusa se continuo a rompere ma non riesco a risolvere nulla...
Grazie

 ha scritto nel messaggio
news:1115285515.3...@z14g2000cwz.googlegroups.com...

No problem. Perché non posti il pezzo di codice in cui richiami GetChunk, così
gli dò un'occhiata?
Per la precisione tutto il blocco che viene eseguito quando State =
icResponseCompleted.
Ciao

Ecco il mio codice... grazie tante.
<CODE>
Private Sub Command1_Click()
    'SCARICO DA FTP
    Inet1.url = "ftp.../xxx/GIULIA"
    Inet1.UserName = "user"
    Inet1.Password = "pwd"
    Inet1.Execute , "DIR /*.*"
    Do While Inet1.StillExecuting
        DoEvents
    Loop
   Inet1.Execute , "CLOSE" ' Close the connection.
End Sub
Private Sub Inet1_StateChanged(ByVal State As Integer)
   Select Case State
   Case 12
      Dim VTData As Variant
      Dim strData As String
      Dim bDone As Boolean
      strData = ""
      bDone = False
      vtData = Inet1.GetChunk(1024, icString)
      DoEvents
      Do While Not bDone
         strData = strData & vtData
         DoEvents
         vtData = Inet1.GetChunk(1024, icString)
         If Len(vtData) = 0 Then
            bDone = True
         End If
      Loop
      MsgBox strData
   End Select
End sub
</CODE>


[CUT]
Il loop dei GetChunk sembra andare bene.
Invece forse non č ancora a posto la DIR: se vuoi il contenuto di una certa
cartella FTP devi specificarla nel comando (oppure esegui il comando CD prima di
DIR), altrimenti si riferisce sempre alla root, indipendentemente dal fatto che
nell'URL tu abbia impostato il percorso completo:
     Inet1.url = "
ftp://ftp.xxx.it
"
     Inet1.UserName = "user"
     Inet1.Password = "pwd"
     Inet1.Execute , "DIR /xxx/GIULIA/*.*"
Funziona cosě?
Ciao
Raf

 Raf
Ahimè no...
ho fatto prima il CD...
inet1.execute , "CD /XXX/giulia"
Do While Inet1.StillExecuting
   DoEvents
Loop
e poi il DIR
Inet1.Execute , "DIR /*.*"
Do While Inet1.StillExecuting
   DoEvents
Loop
ma non mi viene restituito nulla...

 ma non mi viene restituito nulla...
Mmmmm... togli un po' lo slash in DIR:
    Inet1.Execute , "DIR *.*"
Ora come va?

 Ora come va?
Niente da fare...
ora disconnette subito, quindi è meglio lasciarlo...
Ho provato a non cambiare dir e leggere DIR dal sito FTP ma niente da
fare non legge nulla (ci sono sia dir che file...).
:-(
non so più che provare...

 non so piů che provare...
Nell'help a riguardo del comando FTP "DIR" si dice che la sintassi dei caratteri
jolly č stabilita dall'host, quindi puň darsi che nel tuo caso non vada bene
indicarli cosě.
Prova con
    Inet1.Execute , "DIR"
e basta, dovrebbe restituire comunque tutti i file della directory.
Oppure (comando alternativo)
    Inet1.Execute , "LS"
Bye

 Bye
Funziona!
Che dire... grazie 1000 per il tuo preziosissimo aiuto e la tua
pazienza.
Ciao

 Ciao
Di nulla, alla prossima.
Ciao
Raf

 Raf
Un vero incubo... non funziona più nulla...
Stesso sito FTP ma nulla...
sul CD fa il connecting
poi sul DIR/LS fa il requesting...
e poi passa subito al close
anche se ho il loop
        Do While Inet1.StillExecuting
            DoEvents
        Loop
che cosa succede?

 che cosa succede?
Nell'evento _StateChanged non segnala null'altro?
Hai provato a collegarti al sito FTP usando un altro programma (ad es. IE)?
Di solito, quando un programma funziona poi all'improvviso smette di andare,
come prima cosa (successiva ad un bel riavvio del PC, se non si rivela efficace)
mi chiedo che cosa nel frattempo è cambiato. Non solo nel mio codice, ma anche
nell'ambiente: reti e firewall, utenti, programmi installati, hardware
collegato, temperatura esterna, grado di stanchezza, fame etc...
Tu cosa mi sai dire?
Infine: vedi un po' se questo articolo può esserti utile:
http://support.microsoft.com/default.aspx?kbid=173264
Ciao
Raf

Il sito FTP funziona correttamente.
L'evento _StateChanged non segnala assolutamente nulla dopo il riavvio
del PC... Che io sappia non è cambianto nulla...
Ho letto anche l'articolo ma mi parla del controllo SP2 io uso
addirittura la SP4...
non so più che fare... Oltretutto non riesco nemmento a trappare
eventuali errori....

 eventuali errori....
In che senso non riesci? Ma si verificano errori?
Raf

Ok ma se ho capito bene l'articolo dice solo di specificare l'URL prima
di username e pwd. Questo l'ho fatto... ma con il seguente codice:
       Inet1.url = "
ftp://ftp.casole.it
"
         Inet1.UserName = "casole_eurochianti"
        Inet1.Password = "Cas_Eu-05"
        Inet1.Execute , "DIR /LDP"
il codice non entra nemmeno nell'evento _StateChanged ...

 il codice non entra nemmeno nell'evento _StateChanged ...
Attenta a mostrare in chiaro username e password, era meglio al limite se me li
mandavi in privato...
Beh, comunque mi sono stati utili perché mi hanno permesso di fare direttamente
qualche prova (tranquilla, puoi fidarti, non ho fatto danni né scaricato i
file...) e ho scoperto che:
a) il comando DIR /LDP effettivamente non funziona come ci si aspetta, e il
programma sembra "impiccarsi"... salvo poi riprendersi dopo più di un minuto.
b) però nell'evento _StateChanged ci si entra eccome. Questa è la sequenza che
ho ottenuto:
StateChanged: 1 (Resolving host)
StateChanged: 2 (Host resolved)
StateChanged: 3 (Connecting)
StateChanged: 4 (Connected)
StateChanged: 7 (Receiving response)
StateChanged: 8 (Response received)
StateChanged: 5 (Requesting)
StateChanged: 6 (Request sent)
StateChanged: 7 (Receiving response)
StateChanged: 8 (Response received)
StateChanged: 5 (Requesting)
StateChanged: 6 (Request sent)
StateChanged: 7 (Receiving response)
StateChanged: 8 (Response received)
StateChanged: 5 (Requesting)
StateChanged: 6 (Request sent)
StateChanged: 7 (Receiving response)
StateChanged: 8 (Response received)
StateChanged: 5 (Requesting)
StateChanged: 6 (Request sent)
StateChanged: 7 (Receiving response)
StateChanged: 8 (Response received)
StateChanged: 5 (Requesting)
StateChanged: 6 (Request sent)
StateChanged: 7 (Receiving response)
StateChanged: 8 (Response received)
StateChanged: 12 (Response completed)
La risposta che ho ottenuto è CRLF...
c) la sintassi che l'host FTP riconosce e interpreta come vogliamo è "DIR LDP/"
(o LDP/*.*)
in questo modo ho ottenuto quei due file (xml e doc) di cui parlavi.
Ciao
Raf