2013-06-28 7 views
6

Dieser Code wird alle Dateien in einem Zip-Archiv auflisten, aber ich möchte Ordner-Auflistung ausschließen. Wenn das Element im Array ein Ordner ist, möchte ich es aus dem Array ausschließen, aber ich möchte immer noch die Dateien im Ordner auflisten. Zeigen Sie den Namen des Ordners nur nicht in der Liste an.PHP-Liste nur Dateien innerhalb Zip-Archiv (Ordner ausschließen)

Gibt es eine Möglichkeit, dass ich feststellen kann, ob das Element ein Verzeichnis in meiner foreach-Schleife ist (wie?) Oder muss ich eine Suche auf dem Array ausführen und nach Ordnern suchen dann deaktivieren (wie?)?

Danke für Ihre Hilfe

+0

Ich habe noch nie ZipArchive oder irgendetwas im Zusammenhang mit ZIP-Dateien in PHP verwendet, aber hier ist eine Aufnahme im Dunkeln. Da ZipArchive Ihnen nicht sagen kann, ob es sich um eine Datei oder ein Verzeichnis handelt, können Sie möglicherweise die Funktion is_dir in PHP verwenden und sie mit einem if ausführen. –

+0

@CBroe, sorry, aber wenn Sie Dateisystemfunktionen verwenden möchten, müssen Sie das Zip-Archiv extrahieren. – sectus

Antwort

2

Ihre foreach nutzlos ist. Es iteratiert über ein Array mit einem Element.

Wie auch immer es gibt zwei Möglichkeiten, Ordner zu erkennen. Zuerst werden die Ordner mit '/' beendet. Der zweite Ordner hat die Größe 0.

$za = new ZipArchive(); 
$za->open('zip.zip'); 
$result_stats = array(); 
for ($i = 0; $i < $za->numFiles; $i++) 
    { 
    $stat = $za->statIndex($i); 
    if ($stat['size']) 
     $result_stats[] = $stat; 
    } 

echo count($result_stats); 
+0

Danke! Aber gibt es eine einfache Möglichkeit, es aus den Ergebnissen zu entfernen, anstatt es nur nicht anzuzeigen? Problem ist, dass ich auch "echo $ za-> numFiles;" um die Anzahl der Dateien anzuzeigen, die nach dem Öffnen im Archiv gefunden wurden. Und wenn ein Ordnername gefunden wird, möchte ich ihn auch aus der Zählung entfernen. –

+0

Ist das einfach? (siehe Update-Antwort) – sectus

+0

Danke sectus! "Der zweite Ordner hat die Größe 0." - Ordner auch, das ist nicht präzise genug. Aber dein erster Weg wird funktionieren. getFromIndex() gibt den vollständigen Eintragsnamen mit einem/(unabhängig vom Betriebssystem) am Ende nur für Ordnereinträge zurück. – StanE

0

Überprüfen Sie einfach die Dateigröße, wenn es Null ist, ist es ein Ordner.

$za = new ZipArchive(); 

    $za->open('zip.zip'); 

    for($i = 0; $i < $za->numFiles; $i++){ 
     $stat = $za->statIndex($i); 
     if($stat['size']!=0){ 
      echo $stat['name']; 
     } 

    } 
+0

Es sollte '! = 0' sein (ohne Anführungszeichen), da die Größe als Ganzzahl angegeben wird. – ComFreek

+0

@ComFreek funktioniert für mich mit Zitaten – David

+0

Es funktioniert natürlich, aber es ist schlechte Codierung Stil. Versuchen Sie ''=' in '===' zu ändern und es wird nicht mehr funktionieren, da drei Gleichheitszeichen auch auf Gleichheit prüfen. – ComFreek