Ja, ich weiß, es ist schwer zu glauben, dass diese FTP-Server noch existieren, aber sie tun es tatsächlich. IBM iSeries-Maschinen führen solche Server aus.
Ich habe bereits eine Antwort, die ftp_nlist
und in_array
beinhaltet, aber, wie einige von euch vielleicht schon erraten haben, ist dies langsam , wenn ein Verzeichnis eine große Anzahl von Elementen enthält.
Aufgrund der fehlenden Unterstützung von SIZE schlägt fopen
im Lesemodus immer fehl (denken Sie daran, dass x
vom FTP-Wrapper nicht unterstützt wird), während ftp_size
immer -1
zurückgibt (das war erwartet) und file_exists
gibt immer false
zurück (vielleicht, weil intern SIZE verwendet wird?).
ftp_get
und ftp_fget
machen den Trick, aber sie laden die gesamte Datei herunter, wenn sie existiert. Nicht sehr gut. Eine mögliche Lösung besteht darin, dass ftp_fget
nur einen Handler einer Datei verwendet, die nur im Lesemodus geöffnet wurde, und die aufgeführte Warnung abfängt. Es ist anders, wenn die Datei nicht existiert, aber diese Lösung fühlt sich ungehobelt an und ich weiß nicht wirklich, ob es machbar ist (vielleicht kann jemand ein Beispiel geben).
Eine andere Lösung verwendet ftp_nb_get
/ ftp_nb_fget
, um zu versuchen, die Datei abzurufen. Wenn die Funktion 0
( FTP_FAILED
) zurückgibt, ist die Datei vermutlich nicht vorhanden. Ich würde immer noch mit einer temporären lokalen Datei umgehen müssen, und es ist saugt, die Verbindung zu schließen und erneut zu öffnen, wenn FTP_MOREDATA
zurückgegeben wird (oder andere FTP-Befehle nicht ausgegeben werden konnten).
Haben Sie eine Idee dafür?
Der Befehl SIZE
ist nicht erforderlich. Sie können dafür einfach die Funktion ftp_nlist()
verwenden, da der Befehl FTP LIST
sowohl ein Verzeichnis als auch eine Datei als Argument übergeben kann.
Obwohl die PHP-Dokumentation fehlt, um zu erwähnen, dass sie in RFC 959 (Seite 32) spezifiziert ist und ist Arbeiten. Hier kommt ein Beispiel. (Danke Debian!
)
Oder ausgedrückt als Funktion:
%Vor% In Kommentaren wurde diskutiert, wie nützlich und zuverlässig die Ergebnisse von LIST
sein können. Lassen Sie mich dazu noch einige Sätze sagen ...
Erstellen von Dateien auf dem Server
Bitte beachten Sie, dass Sie vermeiden sollten, sich auf etwas wie:
zu verlassen %Vor%weil es möglich ist, dass die Datei von einem anderen Client zwischen der ersten und zweiten Funktion erstellt wird. Dies trifft zwar auch auf lokale Dateisysteme zu, kann jedoch in verteilten Client-Server-Anwendungen aufgrund längerer Antwortzeiten im Vergleich zu einem lokalen Dateisystem und aufgrund möglicherweise vieler anonymer Clients (wie im obigen Beispiel) einfacher auftreten.
Wenn ich Dateien remote erstelle, würde ich vorschlagen, einem starken Benennungsschema in öffentlichen beschreibbaren Ordnern zu folgen, um Kollisionen zu vermeiden. Wenn Sie diesem Schema folgen, dann schreiben Sie einfach und egal. Das Schlimmste, was passieren kann, ist, dass du etwas überschreibst, das jemand anderes versehentlich erstellt hat. Aber wer schafft versehentlich etwas wie /client/id/file_name.txt
?
Herunterladen von Dateien vom Server oder Verschieben, Löschen von Dateien auf dem Server
Wenn Sie eine dieser Operationen versuchen, interessiert nicht darüber, ob die Dateien vor der Operation existieren oder nicht. Mach es einfach. Aber wenn es fehlschlägt, müssen Sie die Fehler richtig behandeln.
Sie können einen "schmutzigen Trick" verwenden : Versuchen Sie ftp_rename()
für die getestete Datei . Beispiel wäre:
Wenn es fehlschlägt, dann haben wir höchstwahrscheinlich eine nicht existierende Datei. Es ist nicht 100%, außer du bist dir über Berechtigungsprobleme sicher. Aber wenn es gelingt - dann ist die Datei definitiv vorhanden. Ich bezweifle, dass es eine andere Möglichkeit gibt, die verwendet werden kann, und Sie vermeiden können, dass Dateien auf lokale FS übertragen werden oder die vollständige Verzeichnisliste behandelt wird.