FTP-Befehl ausführen (ftp.cmd)
Deklaration
result, err = ftp.cmd(URL, cmd [, connectTimeoutSec ])
Parameter
- URL
Text. Entfernte FTP-URL einschließlich Benutzername und Passwort. Verwenden Sie für Verzeichnisoperationen eine Verzeichnis-URL, die mit/endet. - cmd
Text. Ein einzelner Befehl des FTP-Protokolls, zum BeispielMKD test. Eine Tabelle mit Befehlen wird nicht unterstützt. - connectTimeoutSec
Reelle Zahl, optional. Verbindungs-Timeout in Sekunden, standardmäßig 10. Die Gesamtdauer der Anfrage wird dadurch nicht begrenzt.
Rückgabewerte
- result
Text oder nil. Bei erfolgreicher Anfrage werden die empfangenen Daten zurückgegeben; dies kann auch eine leere Zeichenfolge sein. Bei einer Verzeichnis-URL ist es normalerweise eine Verzeichnisliste, nicht der Statuscode des FTP-Befehls oder die Antwort der Steuerverbindung. Bei einem Fehler wird nil zurückgegeben. - err
Text oder nil. Bei einem Fehler wird dessen Ursache als Text zurückgegeben. Bei Erfolg wird kein zweiter Wert zurückgegeben; die empfangende Variable ist daher nil.
Beschreibung
Sendet einen Befehl an den FTP-Server, etwa zum Erstellen von Verzeichnissen. Die Operationen betreffen Dateien oder Verzeichnisse auf dem Server.
Der Befehl wird ausgeführt, bevor in das in der URL angegebene Verzeichnis gewechselt wird. Relative Pfade beziehen sich auf das Standardverzeichnis nach der Anmeldung. Beispielsweise erstellt MKD uploads/test das Verzeichnis test innerhalb von uploads unter diesem Verzeichnis. Verlassen Sie sich nicht darauf, dass der URL-Pfad das Arbeitsverzeichnis des Befehls ändert. Pfade im Befehl werden direkt und ohne URL-Prozentdekodierung gesendet.
MKD erstellt normalerweise nur eine Verzeichnisebene; das übergeordnete Verzeichnis muss bereits vorhanden sein. Die Operation kann fehlschlagen, wenn das Verzeichnis bereits existiert, dem Konto die Berechtigung fehlt oder der Server den Befehl nicht unterstützt. Für mehrere Ebenen muss die Funktion für jedes Verzeichnis einzeln aufgerufen werden, vom übergeordneten zum untergeordneten Verzeichnis.
Enthält der Befehlstext in der aktuellen Implementierung LIST oder NLST in Großbuchstaben, wird der Befehl nicht gesendet; es wird nur die Standardanfrage für die URL ausgeführt. Dies gilt auch dann, wenn diese Zeichenfolgen in einem Verzeichnisnamen vorkommen. Daher schaltet NLST nicht auf eine Liste mit ausschließlich Dateinamen um, und die Argumente von LIST -a bleiben ohne Wirkung.
Nach der Befehlsausführung fordert die Funktion weiterhin die Daten der URL an; bei einer Verzeichnis-URL wird auch die Verzeichnisliste abgerufen. Scheitert anschließend der Listenabruf oder die Datenverbindung, kann das Verzeichnis bereits erstellt worden sein, während die Funktion dennoch nil und eine Fehlermeldung zurückgibt.
Diese Funktion kann die Ausführung abgeben; andere Threads können vor ihrer Rückkehr ausgeführt werden.
Einfaches Beispiel
Benutzername und Passwort stehen in der URL. Das Format ist wie folgt (eckige Klammern kennzeichnen optionale Teile):
ftp://[user:password@]host[:port]/path
Enthält der Benutzername oder das Passwort
@,:oder/, können diese Zeichen entsprechend durch%40,%3Aoder%2Fmaskiert werden. Andere in einer URL ungültige Zeichen können prozentkodiert werden. Erstellen Sie beispielsweise mit dem Benutzernamenhavonzund dem Passwort11@@22das Verzeichnis test im Standardverzeichnis nach der Anmeldung:
local result, err = ftp.cmd("ftp://havonz:11%40%[email protected]/", "MKD test", 10)
if result == nil then
sys.alert("Erstellen fehlgeschlagen: " .. tostring(err))
else
sys.alert("Erfolgreich erstellt")
end
Komplexes Beispiel
Erstellen Sie zuerst demo und danach demo/logs; beide dürfen noch nicht existieren. Bei einem Fehler wird abgebrochen. Zuvor erstellte Verzeichnisse werden nicht automatisch gelöscht.
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("Erstellen fehlgeschlagen " .. path .. ": " .. tostring(err))
return
end
end
sys.alert("Verzeichnisse erstellt")
Hinweis: Der obige Code verwendet sys.alert, eine Funktion aus einem anderen Kapitel.