Start · Sprachen · PHP · Referenz · ftp_rawlist

ftp_rawlist

Funktion

Gibt eine detaillierte Roh-Liste der Dateien und Verzeichnisse im angegebenen FTP-Verzeichnis zurück, so wie der Server sie liefert.

seit PHP 4.0.0 Kategorie: io

Signatur

ftp_rawlist(FTP\Connection $ftp, string $directory, bool $recursive = false): array|false

Beschreibung

ftp_rawlist() sendet den FTP-Befehl LIST an den Server und gibt die Antwort als Array zurück, wobei jede Zeile der Serverantwort einem Eintrag im Array entspricht. Das Format der Zeilen ist serverseitig festgelegt (in der Regel Unix-ähnliches ls -l-Format) und muss daher manuell geparst werden.

Im Gegensatz zu ftp_nlist(), das nur Dateinamen liefert, enthält ftp_rawlist() vollständige Metadaten wie Berechtigungen, Besitzer, Gruppe, Dateigröße und Änderungsdatum. Dies ist nützlich, wenn Sie Datei-Eigenschaften auf einem FTP-Server ermitteln möchten, ohne für jede Datei einzelne Abfragen senden zu müssen.

Der Parameter $recursive bewirkt, dass der Server – sofern er dies unterstützt – rekursiv alle Unterverzeichnisse mit auflistet. Beachten Sie, dass nicht alle FTP-Server die rekursive Auflistung unterstützen oder das Ausgabeformat dabei variieren kann.

Da das zurückgegebene Format serverabhängig ist, sollte das Ergebnis mit regulären Ausdrücken oder speziellen Parser-Bibliotheken ausgewertet werden. Für eine einfachere und portablere Dateiliste bietet sich ftp_nlist() oder ftp_mlsd() (ab PHP 7.2) an.

Parameter

Name Typ Default Beschreibung
$ftp Pflicht FTP\Connection Eine gültige FTP-Verbindungsinstanz, die mit ftp_connect() oder ftp_ssl_connect() erstellt wurde.
$directory Pflicht string Der Pfad des Verzeichnisses auf dem FTP-Server, dessen Inhalt aufgelistet werden soll. Es können auch Optionen wie -la als Teil des Strings übergeben werden (z. B. '-la /pfad'), sofern der Server dies unterstützt.
$recursive bool false Wenn true, wird der FTP-Befehl LIST -R verwendet, um Unterverzeichnisse rekursiv aufzulisten. Nicht alle Server unterstützen dies.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein Array von Strings zurück, wobei jedes Element einer Zeile der Serverantwort entspricht (typischerweise im Unix-ls -l-Format). Bei einem Fehler oder wenn das Verzeichnis nicht aufgelistet werden kann, wird false zurückgegeben.

Beispiele

Einfache Dateiliste eines FTP-Verzeichnisses ausgeben

<?php
$ftp = ftp_connect('ftp.example.com');
if ($ftp === false) {
    die('Verbindung fehlgeschlagen.');
}

if (!ftp_login($ftp, 'benutzer', 'geheim')) {
    die('Login fehlgeschlagen.');
}

$liste = ftp_rawlist($ftp, '/');
if ($liste === false) {
    echo 'Konnte Verzeichnis nicht lesen.';
} else {
    foreach ($liste as $eintrag) {
        echo $eintrag . PHP_EOL;
    }
}

ftp_close($ftp);
drwxr-xr-x 2 user group 4096 Jan 15 10:30 public_html -rw-r--r-- 1 user group 1234 Jan 10 08:00 readme.txt -rw-r--r-- 1 user group 5678 Jan 12 09:15 archive.zip

Roh-Liste parsen und Dateinamen mit Größen extrahieren

<?php
$ftp = ftp_connect('ftp.example.com');
ftp_login($ftp, 'benutzer', 'geheim');

$liste = ftp_rawlist($ftp, '/public_html');

if ($liste !== false) {
    foreach ($liste as $zeile) {
        // Typisches Unix-Format: Berechtigungen Links Besitzer Gruppe Größe Monat Tag Zeit/Jahr Name
        if (preg_match(
            '/^([\-dl][rwxst\-]{9})\s+(\d+)\s+(\S+)\s+(\S+)\s+(\d+)\s+(\S+\s+\S+\s+\S+)\s+(.+)$/',
            $zeile,
            $treffer
        )) {
            $typ        = $treffer[1][0]; // '-' = Datei, 'd' = Verzeichnis, 'l' = Symlink
            $groesse    = (int) $treffer[5];
            $name       = $treffer[7];
            $typLabel   = match($typ) {
                'd' => 'Verzeichnis',
                'l' => 'Symlink',
                default => 'Datei'
            };
            printf("%-12s %-30s %d Bytes\n", $typLabel, $name, $groesse);
        }
    }
}

ftp_close($ftp);
Verzeichnis images 4096 Bytes Datei index.php 2048 Bytes Datei style.css 512 Bytes

// Wichtig · Fallstricke

Serverseitiges Format: Das Format der zurückgegebenen Zeilen ist nicht standardisiert und hängt vom FTP-Server ab. Auf Unix-Systemen entspricht es meist dem ls -l-Format, Windows-FTP-Server können ein abweichendes Format liefern. Parser sollten daher defensiv geschrieben werden.

Passive vs. aktive Verbindung: Bei Problemen mit der Verbindung hinter Firewalls oder NAT sollte ftp_pasv($ftp, true) vor dem Aufruf verwendet werden, um den passiven Modus zu aktivieren.

Alternative: Für eine maschinenlesbarere und serverunabhängige Ausgabe sollte ftp_mlsd() (verfügbar ab PHP 7.2) bevorzugt werden, sofern der Server MLSD unterstützt.

Objekt-API: Ab PHP 8.1 ist FTP\Connection eine echte Klasse; davor war die Ressource vom Typ resource. Der Code bleibt dabei weitgehend kompatibel.