Página 1 de 1

tFtp - establecer conexión con servidor Ftp

Publicado: Lun Abr 10, 2006 10:00 am
por joseluis
Hola,
¿Como se hace? He estado consultado la documentación y no he sabido ver
un método tal como sigue:
oFtp:Open( cftpUrl, cUser, cPass )
Saludos y gracias por vuestra ayuda.
José Luí­s Capel

tFtp - establecer conexión con servidor Ftp

Publicado: Lun Abr 10, 2006 1:53 pm
por jlalin
José Luis,
aquí­ tienes un ejemplo. Está escrito al vuelo y podrí­a tener algún error
de sintaxis:
//---
FUNCTION TestFTP()
WITH OBJECT TFtp():New()
:cUser := "User"
:cPassword := "Pass"
:Create()
If :Open()
If :Connect( "ftp.miserver.com" )
//Aquí­ lo que quieras hacer
Endif
:Close()
Endif
:Destroy()
END
RETURN Nil
//---
Saludos,
José Lalí­n

tFtp - establecer conexión con servidor Ftp

Publicado: Lun Abr 10, 2006 4:25 pm
por joseluis
José,
>
> aquí­ tienes un ejemplo. Está escrito al vuelo y podrí­a tener algún error
> de sintaxis:
>
> //---
> FUNCTION TestFTP()
>
> WITH OBJECT TFtp():New()
> :cUser := "User"
> :cPassword := "Pass"
> :Create()
>
> If :Open()
> If :Connect( "ftp.miserver.com" )
> //Aquí­ lo que quieras hacer
> Endif
> :Close()
> Endif
>
> :Destroy()
> END
>
> RETURN Nil
> //---
Muuchas gracias!!!
Tengo las siguientes dudas...
a. Tienes previsto implementar el comando ABORT (o similar)? El caso es
que a veces tenemos que cortar la comunicación con el servidor de forma
inmediata (estando incluso en proceso de enví­o/recepción de ficheros).
Sino, haciendo un oFtp:command("ABOR") ¿serí­a suficiente?
b. El envento OnCommand no acabo de verlo claro. Según la documentación
se dispara después del enví­o de un comando (supongo que solo después
de ejecutar el oFtp:Command). Pero... ¿como se cual oFtp:command lo
disparó? Tambien dice la documentación que hay que mirar un método
readfile para ver la respuesta del servidor ftp. No veo ese método
documentado.
c. En mi caso, tengo que hacer transferencias en ambos sentidos con
tamaños variables (a veces incluso de 1MB o más). ¿Como podrí­a tener
información del progreso de la transmisión?
d. ¿Es necesario el tener un formulario activo para utilizar la clase
tFtp? Es decir, ¿puedo utilizarlo sin crear ningún formulario? (tipo
'commandline')
Saludos,
José Luis Capel

tFtp - establecer conexión con servidor Ftp

Publicado: Lun Abr 10, 2006 4:27 pm
por joseluis
José,
Y una última cuestión:
¿habrí­a alguna posibilidad de volcar a un fichero tipo log 'la
conversación ftp server/client ?
Saludos y gracias,
José Luis Capel

tFtp - establecer conexión con servidor Ftp

Publicado: Lun Abr 10, 2006 4:47 pm
por joseluis
José,
>
> b. El envento OnCommand no acabo de verlo claro. Según la documentación
> se dispara después del enví­o de un comando (supongo que solo después de
> ejecutar el oFtp:Command). Pero... ¿como se cual oFtp:command lo
> disparó? Tambien dice la documentación que hay que mirar un método
> readfile para ver la respuesta del servidor ftp. No veo ese método
> documentado.
>
He visto que tFtp desciende de tInternet. Ahí­ es donde está la
documentación que no veí­a.
Saludos,
José Luis Capel

tFtp - establecer conexión con servidor Ftp

Publicado: Lun Abr 10, 2006 6:55 pm
por jlalin
José Luis,
> a. Tienes previsto implementar el comando ABORT (o similar)? El caso es
> que a veces tenemos que cortar la comunicación con el servidor de forma
> inmediata (estando incluso en proceso de enví­o/recepción de ficheros).
> Sino, haciendo un oFtp:command("ABOR") ¿serí­a suficiente?
Sí­, el método Command() sirve para enviar mandatos directamente al
servidor FTP. Lo implementé para no tener que tocar el código de la
clase para adaptarla a diferentes tipos de servidor FTP.
> b. El envento OnCommand no acabo de verlo claro. Según la documentación
> se dispara después del enví­o de un comando (supongo que solo después de
> ejecutar el oFtp:Command). Pero... ¿como se cual oFtp:command lo
> disparó? Tambien dice la documentación que hay que mirar un método
> readfile para ver la respuesta del servidor ftp. No veo ese método
> documentado.
El método Command() devuelve TRUE o FALSE para indicar si el servidor
FTP entendió el mandato, luego se lanza OnCommand si la operación tuvo
éxito.
> c. En mi caso, tengo que hacer transferencias en ambos sentidos con
> tamaños variables (a veces incluso de 1MB o más). ¿Como podrí­a tener
> información del progreso de la transmisión?
Tendrás que usar un TProgressBar y actualizar en el bucle de
lectura/escritura. Para subir un archivo serí­a algo así­:
//---
If oNet:Connect( cServer )
hFile := FOpen( "test.txt" )
If hFile > -1
hRemote := oNet:OpenFileWrite( "test.txt" )
If hRemote != 0
While lOk .AND. ( nRead := FRead( hFile, @cBuffer, nBuffer ) ) > 0
lOk := oNet:WriteFile( hRemote, @cBuffer, nRead )
//Aquí­ actualizar TProgressBar
End
Endif
oNet:CloseFile( hRemote )
FClose( hFile )
Endif
//---
NOTA: No hace falta que llames a ProcessMessages() dentro del bucle
While porque Xailer ya lo hace automáticamente.
> d. ¿Es necesario el tener un formulario activo para utilizar la clase
> tFtp? Es decir, ¿puedo utilizarlo sin crear ningún formulario? (tipo
> 'commandline')
Creo que sí­. Al hacer los tests para probar las clases recuerdo que
lanzaba el EXE del test y escribí­a la información de debug a un archivo
sin interactuar con el test hasta que terminaba. ¿ Te refieres a eso o a
tener tu aplicación funcionando y una sesión FTP en segundo plano ?
Saludos,
José Lalí­n

tFtp - establecer conexión con servidor Ftp

Publicado: Lun Abr 10, 2006 7:02 pm
por jlalin
José Luis,
> ¿habrí­a alguna posibilidad de volcar a un fichero tipo log 'la
> conversación ftp server/client ?
No tengo inconveniente en implementarlo aunque también se me ocurre que
puedes derivar una clase y personalizarla a tu gusto.
//---
CLASS TFTP FROM XFTP
PUBLIC:
METHOD Connect( cServer )
METHOD Log( cStr )
ENDCLASS
METHOD Connect( cServer ) CLASS TFTP
LOCAL lOk
::Log( "Connect: " + cServer )
IF ( lOK := Super:Connect( cServer ) )
::Log( " Conectado" )
ELSE
::Log( " Error:" + Str( ::nLastError ) + ::GetErrorDescription() )
ENDIF
RETURN lOk
METHOD Log( cStr ) CLASS TFTP
DEFAULT cStr TO ""
Memowrit( "Log.txt", MemoRead( "Log.txt" ) + cStr )
RETURN Nil
//---
Como te decí­a no tengo problema en implementarlo nativamente pero
prefiero que lo decidan Jose F. o Ignacio.
Saludos,
José Lalí­n