OT: Ejemplo de uso espec
Publicado: Mar Feb 27, 2007 10:23 am
por jose.luis
Hola,
¿Alguien tiene algún ejemplo de uso de la clase tFtp?
Saludos y gracias,
José Luis Capel
OT: Ejemplo de uso espec
Publicado: Mar Feb 27, 2007 11:43 am
por jose.luis
Hola,
¿Existe algún método o propiedad de tFtp que me permita grabar la
'conversación' del cliente ftp y el servidor?
Saludos y gracias,
José Luis Capel
"José Luis Capel - Aicom" <
jose.luis@iaicom.com> escribió en el mensaje
news:[email=
45e3f835@news.xailer.com...]
45e3f835@news.xailer.com...[/email]
> Hola,
>
> ¿Alguien tiene algún ejemplo de uso de la clase tFtp?
>
> Saludos y gracias,
> José Luis Capel
>
>
OT: Ejemplo de uso espec
Publicado: Mar Mar 06, 2007 1:35 pm
por Bingen Ugaldebere
Esto lo que yo he preparado para que mis programas actualicen via FTP,
como siempre tendrás que adaptarlo a tus necesidades y si no preguntas
que pa eso estamos.
Salu2.
FUNCTION CheckFtpUpdates()
LOCAL oNet := TFtp():New(), oZip
LOCAL hFile, hRemote
LOCAL nBuffer := 1024 * 4, cBuffer := Space( nBuffer )
LOCAL lOk := .F., nFile:=1, nLine:=1, dLimite:=Ctod(" - - ")
LOCAL nRead, lUpdated:=.F.
Local aFiles := Array( 1 ), aSizes:= Array( 1 ), aDates:= Array( 1
), aTimes:= Array( 1 )
Local aFilesFTP := Array( 0 ), aZipFiles := Array( 0 )
Local aDir := aDir( AppData:cExeName, aFiles , aSizes, aDates, aTimes)
Local dUpdateDate, cUpdateTime
LOCAL cServer := AppData:cFTPServer
Local cFTPPath := AppData:cFTPPath
oNet:cUser := AppData:cFTPUser
onet:cPassword := AppData:cFTPPsw
If !AppData:lFTPAuto
Return .F.
Endif
//Create BACKUP path If necessary
If !ExistDir( AppData:cDataBackup )
MakeDir( AppData:cDataBackup )
If !AppData:lUser
MsgInfo(If(AppData:cOriginalLng<>"ESP",;
"Created backup folder ","Se ha creado la carpeta
de backup ")+;
AppData:cDataBackup)
Endif
Endif
oNet:Create()
If oNet:Open()
If oNet:Connect( cServer )
If oNet:SetCurrentDirectory(cFTPPath)
//Compueba la versión existente en el FTP
hRemote := oNet:OpenFileRead( "Version.txt" )
If hRemote != 0
oNet:ReadFile( hRemote, @cBuffer, nBuffer )
dUpdateDate:=Ctod(Alltrim(Substr(MemoLine(cBuffer,,2),At("= ",MemoLine(cBuffer,,2))+1)))
cUpdateTime:=Alltrim(Substr(MemoLine(cBuffer,,3),At("=",MemoLine(cBuffer,,3))+1))
oNet:CloseFile( hRemote )
Else
MsgStop("Imposible acceder a las actualizaciones del
FTP. Version.txt no válido")
Return .F.
Endif
//Graba la fecha del último check al FTP
AppData:cFTPCheck:=Date()
//Comprueba si el cliente está autorizado y la vigencia del
contrato
hRemote := oNet:OpenFileRead( "Licences.txt" )
If hRemote != 0
oNet:ReadFile( hRemote, @cBuffer, nBuffer )
oNet:CloseFile( hRemote )
For nLine:=1 to MlCount(cBuffer)
If
At(Upper(AppData:cFTPLicence),Upper(Memoline(cBuffer,,nLine) )) >0
lOk:=.t.
dLimite:=Ctod(Alltrim(StrTran(Upper(Memoline(cBuffer,,nLine) ),Upper(AppData:cFTPLicence), "")))
Exit
Endif
Next
If !lOk
MsgStop(AppData:cFTPLicence+CRLF+CRLF+;
"Hay una nueva versión del programa del
"+Dtoc(dUpdateDate)+" a las "+cUpdateTime+CRLF+CRLF+;
"Pero el usuario "+AppData:cFTPLicence+" no
esta autorizado para hacer la actualización.")
Return .F.
Else
If Date()>dLimite
MsgStop("Hay una nueva versión del programa del
"+Dtoc(dUpdateDate)+" a las "+cUpdateTime+CRLF+CRLF+;
"Pero el usuario "+AppData:cFTPLicence+"
ha vencido su periodo de licencia "+Dtoc(dLimite))
Return .F.
Endif
Endif
Else
MsgStop("Imposible acceder a las actualizaciones del
FTP. Licences.txt no válido")
Return .F.
Endif
//Comprueba si la actualización del FTP es mas nueva que el
programa en curso
If Ctod(Left(AppData:cFTPLast,10)) < dUpdateDate .Or. ;
( Ctod(Left(AppData:cFTPLast,10)) = dUpdateDate .And.
SubStr(AppData:cFTPLast,12,8) < cUpdateTime )
If MsgYesNo(AppData:cFTPLicence+CRLF+CRLF+;
"Usuario autorizado. Fecha límite de
licencia "+Dtoc(dLimite)+CRLF+CRLF+;
"Hay una nueva versión del programa del
"+Dtoc(dUpdateDate)+" a las "+cUpdateTime+CRLF+CRLF+;
"¿Desea descargar e instalar esta nueva
versión?")
//Muestra información de la actualización si existe
Info.Txt
hRemote := oNet:OpenFileRead( "Info.txt" )
If hRemote != 0
oNet:ReadFile( hRemote, @cBuffer, nBuffer )
MsgPostIt(cBuffer)
oNet:CloseFile( hRemote )
Endif
//Recuperar archivo ZIP con la última actualización
If(File("Patch.zip"),Ferase("Patch.zip"),)
WaitOn("Recuperando archivos de actualización desde
el servidor FTP",;
"Actualización del programa en curso....")
oNet:GetFile("Patch.zip","Patch.zip",.F.)
WaitOff()
If !File("Patch.zip")
MsgStop("Imposible actualizar el programa el
fichero Patch.zip no ha sido localizado")
Return .F.
Endif
//Obtener lista de archivos incluidos en la actualización
WITH OBJECT oZip := TUnZipFile()
:cFileName := "Patch.zip"
aFilesFTP := oZip:aFiles
END
//Hacer un ZIP con los archivos que van a ser sustituidos
WaitOn("Guardando copia de los archivos que van a ser
sustituidos")
For nFile:=1 to Len(aFilesFTP)
If File( Left(AppData:cExename,3)+aFilesFTP[nFile,1] )
Aadd( aZipFiles,
Left(AppData:cExename,3)+aFilesFTP[nFile,1] )
Endif
Next
WITH OBJECT oZip := TZipFile()
:aFileMask := aZipFiles
:cFileName := AppData:cDataBackup+"Update
"+Dtoc(Date())+".Zip"
:lIncludePath := .T.
:nCompressionLevel:= pkBEST
:Run()
END
//Grabar fecha y hora del último update en modo local
AppData:cFTPLast:=Dtoc(dUpdateDate)+" "+cUpdateTime
//Grabar Usuario fecha y hora del último update en el FTP
hRemote := oNet:OpenFileRead( "Version.txt" )
If hRemote != 0
oNet:ReadFile( hRemote, @cBuffer, nBuffer )
oNet:CloseFile( hRemote )
hRemote := oNet:OpenFileWrite(
cFTPPath+"Version.txt" )
If hRemote != 0
cBuffer:=cBuffer+CRLF+AppData:cFTPLicence+"
"+Dtoc(Date())+" "+Time()
oNet:WriteFile( hRemote, @cBuffer, Len(cBuffer) )
oNet:CloseFile( hRemote )
Endif
Endif
WaitOff()
lUpdated:=.T.
Endif
Endif
Endif
Endif
oNet:Close()
Endif
oNet:Destroy()
If lUpdated
Execute("Patch.Exe",,.F.)
Application:oMainForm:Close()
Endif
RETURN lUpdated