Ejecutar un comando FTP (ftp.cmd)
Declaración
result, err = ftp.cmd(URL, cmd [, connectTimeoutSec ])
Parámetros
- URL
Tipo texto. URL FTP remota que incluye la cuenta y la contraseña. Para operaciones con directorios, use una URL de directorio que termine en/. - cmd
Tipo texto. Un único comando del protocolo FTP, comoMKD test. No se admite una tabla de comandos. - connectTimeoutSec
Número real, opcional. Tiempo de espera de la conexión en segundos; valor predeterminado: 10. No limita la duración total de la solicitud.
Valores devueltos
- result
Texto o nil. Si la solicitud tiene éxito, devuelve los datos recibidos, que pueden ser una cadena vacía. Con una URL de directorio, suele ser un listado del directorio, no el código de estado del comando FTP ni la respuesta de la conexión de control. Devuelve nil en caso de error. - err
Texto o nil. En caso de error, devuelve una descripción textual de la causa. Si tiene éxito, no devuelve un segundo valor, por lo que la variable que lo recibe es nil.
Descripción
Envía un comando al servidor FTP para realizar operaciones como crear directorios. Las operaciones actúan sobre archivos o directorios del servidor.
El comando se ejecuta antes de cambiar al directorio indicado en la URL. Las rutas relativas parten del directorio predeterminado tras iniciar sesión; por ejemplo, MKD uploads/test crea test dentro de uploads bajo ese directorio. No confíe en la ruta de la URL para cambiar el directorio de trabajo del comando. Las rutas del comando se envían directamente, sin decodificación porcentual de URL.
MKD suele crear un solo nivel de directorio, por lo que el directorio padre debe existir. La operación puede fallar si el directorio ya existe, la cuenta no tiene permisos o el servidor no admite el comando. Para crear varios niveles, llame a la función por separado para cada directorio, del padre al hijo.
En la implementación actual, si el texto del comando contiene LIST o NLST en mayúsculas, se omite el envío del comando y solo se realiza la solicitud predeterminada de la URL. Esto también ocurre si esas subcadenas aparecen en el nombre de un directorio. Por tanto, NLST no cambia a un listado solo de nombres de archivo y los argumentos de LIST -a no tienen efecto.
Después de ejecutar el comando, la función sigue solicitando los datos de la URL; con una URL de directorio, también obtiene el listado del directorio. Si después falla el listado o la conexión de datos, es posible que el directorio ya se haya creado, pero la función seguirá devolviendo nil y un mensaje de error.
Esta función puede ceder la ejecución; otros hilos pueden ejecutarse antes de que retorne.
Ejemplo sencillo
Incluya la cuenta y la contraseña en la URL. El formato es el siguiente (los corchetes indican partes opcionales):
ftp://[user:password@]host[:port]/path
Si la cuenta o la contraseña contienen
@,:o/, pueden escaparse como%40,%3Ao%2F, respectivamente. Los demás caracteres no válidos en una URL pueden usar codificación porcentual. Por ejemplo, con la cuentahavonzy la contraseña11@@22, cree test en el directorio predeterminado tras iniciar sesión:
local result, err = ftp.cmd("ftp://havonz:11%40%[email protected]/", "MKD test", 10)
if result == nil then
sys.alert("Error al crear: " .. tostring(err))
else
sys.alert("Creación correcta")
end
Ejemplo complejo
Cree primero demo y después demo/logs; ninguno de los dos debe existir todavía. Si falla algún paso, deténgase. Los directorios creados previamente no se eliminan automáticamente.
local url = "ftp://havonz:11%40%[email protected]/"
for _, path in ipairs({ "demo", "demo/logs" }) do
local result, err = ftp.cmd(url, "MKD " .. path, 10)
if result == nil then
sys.alert("Error al crear " .. path .. ": " .. tostring(err))
return
end
end
sys.alert("Directorios creados")
Nota: El código anterior utiliza sys.alert, una función de otro capítulo.