Hola David.
Buena aportación.
Yo no uso FTP desde hace años pero he desempolvado una rutina y propongo la siguiente modificación para tener información del resultado de la ejecución del comando FTP.
Para las pruebas he usado el servidor FTP de FileZilla.
Creamos un proceso PRO_FTP_SUBIR que nos permita encapsular todo el código para su uso en cualquier aplicación:
Rem ( Proceso PRO_FTP_SUBIR que ejecuta el comando FTP para subir al Servidor un archivo local )
Rem ( CFTP_SERVIDOR: IP o dirección del Servidor FTP )
Rem ( CFTP_USUARIO: Usuario con derechos de accesoi de escritura a la Subcarpeta )
Rem ( CFTP_PASSWORD: Contraseña de acceso )
Rem ( CFTP_SUBCARPETA: Carpeta donde se añade el archivo local )
Rem ( CARCHIVO_LOCAL: Path completo del archivo que se va a subir al servidor FTP )
Rem ( Archivo BAT que ejecutará VClient (No es necesario, usamos el comando MSDOS en su lugar) )
Set ( CARCHIVO_BAT, sysCacheClientPath + "_ftp_subir.bat" )
Rem ( Archivo de Texto con los comandos que ejecutará FTP de manera automática )
Set ( CARCHIVO_CMD, sysCacheClientPath + "_ftp_comandos.txt" )
Rem ( Archivo de Texto con el log de ejecución )
Set ( CFICHERO_LOG, sysCacheClientPath + "_ftp_resultado.txt" )
Libre
Rem ( Montamos un archivo de texto con los comandos FTP para el Login y el Envío del archivo )
Fichero: Abrir ( hFiche, CARCHIVO_CMD, Lectura/escritura (Crea o limpia), LOK, ISO-8859-1 )
Fichero: Grabar línea ( hFiche, "user " + CFTP_USUARIO + "\n" + CFTP_PASSWORD + "\n" + "bin\n" + choose(isEmpty(CFTP_SUBCARPETA), "", "cd " + CFTP_SUBCARPETA)+ "\n" + "put " + CARCHIVO_LOCAL + "\n" + "quit" , LOK )
Libre
¿Existe fichero? ( CARCHIVO_CMD, LOK, )
If ( LOK = 0 )
Set ( CERROR, "No se ha podido crear " + CARCHIVO_CMD + ".<br><br>Envío cancelado" )
Set retorno proceso = NO
Finalizar proceso
Libre
Rem ( Archivo para el LOG con los mensajes del Servidor )
Set ( CFTP_LOG, "" )
¿Existe fichero? ( CFICHERO_LOG, LOK, )
If ( LOK )
Eliminar fichero de disco ( CFICHERO_LOG, LOK )
Libre
Rem ( Ejecutar el comando de sistema en lugar del .bat nos permite ejecución síncrona y esperar el resultado )
Rem ( Parámetro -n para evitar Login automático. -s para ejecutar los comandos del archivo de texto )
Set ( CFTP_COMANDO, "ftp -n -s:" + CARCHIVO_CMD + " " + CFTP_SERVIDOR + " >" + CFICHERO_LOG )
Libre
Ejecutar comando del sistema ( CFTP_COMANDO, NRESUL )
Libre
Rem ( El comando ftp siempre devolverá 0. Se devuelve 1 en el caso de que el comando no esté bien escrito)
If ( NRESUL = 0 )
Set ( CRESULTADO, "OK - Comando FTP ejecutado" )
¿Existe fichero? ( CFICHERO_LOG, LOK, )
If ( LOK )
Rem ( Hay una serie de Códigos de respuesta. )
Rem ( 530 - Login o Password incorrecta )
Rem ( 550 - La carpeta remota no existe o no tiene permiso de escritura )
Rem ( 226 - Transferencia correcta )
Fichero: Abrir ( hResul, CFICHERO_LOG, Solo lectura, LOK, .Ninguno )
Set ( LOK, 1 )
For ( NLIN, 1, LOK, 1 )
Fichero: Leer línea ( hResul, CLINEA, LOK )
Set ( CFTP_LOG, CFTP_LOG + CLINEA + "\n" )
Rem ( Comprobamos el resultado )
If ( indexOfRegExp(CFTP_LOG, "\n530 ", 0, 0) > -1 )
Set ( CRESULTADO, "FALLO - Usuario o contraseña incorrectos" )
Else if ( indexOfRegExp(CFTP_LOG, "\n550 ", 0, 0) > -1 )
Set ( CRESULTADO, "FALLO - No existe la carpeta remota o no tiene permiso de escritura" )
Else if ( indexOfRegExp(CFTP_LOG, "\n226 ", 0, 0) > -1 )
Set ( CRESULTADO, "OK - Transferencia correcta" )
Else
Set ( CRESULTADO, "FALLO - Causa desconocida" )
Set ( CRESULTADO, CRESULTADO + choose(LVER_LOG, "\n\n" + CFTP_LOG, "") )
Else
Set ( CERROR, "Ha habido un problema con el <b>comando ftp</b>" )
Set retorno proceso = NO
Finalizar proceso
Libre
Desde un Manejador ejecutamos el proceso de la siguiente manera:
Rem ( Envío de archivo al Servidor FTP )
Set ( CARCHIVO_LOCAL, choose(isEmpty(CARCHIVO_LOCAL), "none", CARCHIVO_LOCAL) )
¿Existe fichero? ( CARCHIVO_LOCAL, LOK, )
If ( LOK = 0 )
Set ( CRESULTADO, "NO existe el archivo local: " + CARCHIVO_LOCAL )
Finalizar proceso
Libre
Crear manejador de objeto ( hFTP, Proceso PRO_FTP_SUBIR@proyecto_app )
Set variable local de objeto ( hFTP, CFTP_SERVIDOR, CFTP_SERVIDOR )
Set variable local de objeto ( hFTP, CFTP_USUARIO, CFTP_USUARIO )
Set variable local de objeto ( hFTP, CFTP_PASSWORD, CFTP_PASSWORD )
Set variable local de objeto ( hFTP, CFTP_SUBCARPETA, CFTP_SUBCARPETA )
Set variable local de objeto ( hFTP, CARCHIVO_LOCAL, CARCHIVO_LOCAL )
Set variable local de objeto ( hFTP, LVER_LOG, LVER_LOG )
Disparar objeto ( hFTP, 1º plano: Local (síncrono), LOK )
Libre
Libre
If ( LOK )
Rem ( En CRESULTADO tenemos el resultado )
Get variable local de objeto ( hFTP, CRESULTADO, CRESULTADO )
Else
Rem ( La variable CERROR no estará vacía )
Get variable local de objeto ( hFTP, CERROR, CRESULTADO )
Libre
Un formulario de ejemplo con el resultado:
El proceso devuelve el FALLO y no muestra el Log.
En la carpeta Home del servidor FTP no hay permiso de escritura.
Saludos
Paco Satué