PHP - Prüfen ob Datei existiert auf dem FTP-server mit keine GRÖßE-Unterstützung

Ja, ich weiß, es ist schwer zu glauben, diese FTP-Servern immer noch vorhanden, aber Sie es tatsächlich tun. IBM iSeries-Maschinen laufen auf solchen Servern.

Ich habe bereits eine Antwort, die beinhaltet ftp_nlist und in_array aber, wie einige von Euch vielleicht schon erraten haben, ist dies langsam, wenn ein Verzeichnis enthält eine große Anzahl von Elementen.

Aufgrund der fehlenden Unterstützung der GRÖßE fopen schlägt immer fehl, wenn verwendet, im lese-Modus (Sie erinnern sich, dass x ist nicht unterstützt durch den FTP-wrapper), während ftp_size gibt immer -1 (das war zu erwarten) und file_exists gibt immer false (vielleicht weil es verwendet GRÖßE intern?).

  • ftp_get und ftp_fget den trick tun, aber Sie download der gesamten Datei, wenn es vorhanden ist. Nicht sehr gut. Eine mögliche Lösung beinhaltet die Verwendung von ftp_fget übergeben und ein handler für eine Datei im schreibgeschützten Modus geöffnet, und nur fangen die Warnung ausgelöst. Anders ist es, wenn die Datei nicht vorhanden ist, aber diese Lösung fühlt sich ungehobelt, und ich weiß wirklich nicht, ob es machbar ist (vielleicht kann mir jemand ein Beispiel geben).

  • Andere Lösung verwendet ftp_nb_get/ftp_nb_fget zu versuchen, um die Datei abzurufen. Wenn die Funktion 0 ( FTP_FAILED ), dann wird die Datei vermutlich nicht vorhanden ist. Ich hatte noch zu tun haben, eine temporäre lokale Datei, und es saugt, um zu schließen und öffnen Sie die Verbindung, wenn FTP_MOREDATA zurückgegeben (oder anderes FTP-Befehle konnte nicht ausgestellt werden).

Haben Sie eine Idee dazu?

  • Bei der Verwendung von ftp_nlist, wie langsam ist es denn eigentlich?
  • Ich würde versuchen, den trick zu tun: verwenden Sie ftp_rename($connection, $testedFile, 'someThingThatDoesntExists'); wenn es scheitert, dann haben wir unsere Antwort ("NEIN". Aber das beruht auf der Tatsache, dass Ziel ist beschreibbar und wir haben die Erlaubnis für die Umbenennung). Wenn es gelang, dann benennen Sie es zurück und wir haben auch unsere Antwort ("JA"). Habe ich nicht getestet, aber Sie können versuchen, und sagen, was passieren wird.
  • Es kann bis zu einer minute für 5000+ Dateien, aber auch ein paar Sekunden wären zu viel für eine Aufgabe wie das.
  • Gut, okay, könnte man benchmark es? Wie lange dauert der Abruf einer Datei-Liste nehmen? Und die Suche mit in_array?
  • Dass einem kleinen, schmutzigen trick und es scheint, dass es tatsächlich funktioniert, aber, selbstverständlich, dass ich möchte in Erster Linie wissen, ob eine Datei existiert, um zu vermeiden überschreiben, die Datei irgendwie verschwinden für eine kurze Zeit. Schöne Anstrengung sowieso.
  • Gut mit Ihrem server werden Sie in der Lage zu beheben, über die einige "dirty trick", ich habe Angst. Und das können Sie vermeiden, dass die übertragung von Dateien. Aber es wird dazu führen, Sortieren, brechen, ja
  • Es dauerte 43.76 Sekunden 5407-Dateien. Die folgenden benchmarks nahm so etwas wie 0,4 Sekunden nur, durch irgendeine Art von server-side-cache denke ich mal? Aber ich kann nicht Sie verlassen sich auf.
  • Es scheint, gibt es eine einfachere Möglichkeit: ich kann mit ftp_rename umbenennen, um die Datei an sich selbst. Seit über ftp_rename im Grunde ist Ihre Idee, wenn Sie setzen Sie alles in eine Antwort, die ich akzeptieren kann.
  • Hm. ja, es wird. Ok. coming soon
  • Darf ich Fragen, warum Sie wissen müssen, wenn die Datei auf dem server gespeichert? Ich Frage, denn die Antwort ist nichts Wert, wenn Sie, versuchen Zugriff auf die Datei zu einem späteren Zeitpunkt, da es möglicherweise gelöscht worden inzwischen. Wenn Sie müssen nur ein Verzeichnis-Auflistung verwenden ftp_nlist ansonsten Tu der Vorgang und auf Fehler prüfen
  • Ich habe bereits erwähnt (weiter oben zu Lesen), dass die Hauptaufgabe ist, um zu vermeiden überschreiben einer Datei mit dem STOR-Befehl. Der FTP-server der iSeries hat einen Befehl, der verhindert, dass dies geschieht, aber es ist ein eigener Befehl und ich will, dass mein script so allgemein wie möglich. Die akzeptierte Antwort ist gut genug, obwohl es hinterlässt einen kurzen offenes Fenster zwischen der Umbenennung und der Speicherung der Befehle.
  • By the way, ich hoffe, du bist nicht derjenige, der downvoted die Frage. Ernsthaft verwirrt mich.
  • Ich habe. Da dieser post ist definitiv nicht eine +4. Haben Sie Lesen Sie die FTP-Daten? warum sollten Sie brauchen, die SIZE Befehl dafür? (XY-problem) Vielleicht war ich nicht klar genug, Sie können LIST für die Datei-Namen, Verzeichnisse
  • Welchen Teil verstehen Sie nicht über die Tatsache, dass eine langwierige operation? Und was hat das mit der Frage zu tun? Sind Sie trolling oder was?
  • Haben Sie versucht, eine einfache LIST /path/to/file ? Verstehen Sie jetzt? Warum fehlt die SIZE Befehl?
  • Wenn Sie eine Antwort haben, warum nicht Sie setzen Sie alles in eine Antwort?! Ich Frage hier nach Hilfe, nicht sinnlose Debatten! Und es erklärt immer noch nicht, warum Sie downvoted die Frage.
  • Ich weiß nicht, wie das Wort "sinnlos", sagte von Jungs, Sie sind offensichtlich nicht in der Lage zu sagen, was es "sinnlos" ist und was nicht. Ich habe die letzten 3 Stunden um eine Lösung zu finden für Sie. Sorry, dass meine Lösung ist nicht das, was Sie hören wollte.
  • Wenn es eine alternative, schreiben Sie die Antwort! könnte ich sogar akzeptieren. Das ist es, was StackOverflow ist für: Menschen die Antworten Lesen Sie zuerst, wenn Sie wollen, um Ihnen zu helfen, dann tun Sie es!
  • Werde ich tun. (aber später verlassen müssen office bald) hatte ich bereits eine Antwort,aber dann nicht gepostet, weil ich wollte 100% sicher sein bevor.. Das ist der Grund, warum stzarted der Diskussion. nicht zu Schaden niemandem..
  • Check meine Antwort.

InformationsquelleAutor MaxArt | 2014-02-26
Schreibe einen Kommentar