2016-04-28 5 views
2

Ich versuche zu überprüfen, ob meine Postleitzahl gültig ist.Anzahl der Ordner im Stammverzeichnis von ZipFile abrufen

Die Zip-Datei sieht wie folgt aus (nur ein Stammordner mit Inhalt):

zip-root 
`-- folder1 
    |-- folder1 
    |-- folder2 
    |-- folder3 
    |-- folder4 
    `-- folder5 

Die Struktur der Zip-Datei betrachtet wird ungültig wenn

  • Wurzel zip enthält mehr als eine ordner

Ich habe versucht die folgenden Grund:

using (ZipArchive archive = ZipFile.OpenRead(ZipFilePath)) 
{ 
    rootArchiveFolder = archive.Entries.Count();   
} 

aber die Anzahl aller Ordner zurück, während ich

in der Zählung root-Ordner- nur interessiert bin

Antwort

0

Ordner mit seinem FullName endend mit Schrägstrich erkannt wird (/). in Ihrem Fall also, können Sie die Liste der Ordner in der Wurzel des Archivs wie diese:

using (ZipArchive archive = ZipFile.OpenRead(ZipFilePath) 
{ 
    var listOfZipFolders = archive.Entries.Where(x => x.FullName.EndsWith("/")).ToList(); 
    int foldersCount = archive.Entries.Count(x => x.FullName.EndsWith("/")); 
} 

oder LINQless Version:

using (ZipArchive archive = ZipFile.OpenRead(ZipFilePath)) 
{ 
    List<ZipArchiveEntry> listOfZipFolders = new List<ZipArchiveEntry>(); 
    foreach (ZipArchiveEntry entry in archive.Entries) 
    { 
     if (entry.FullName.EndsWith("/")) 
      listOfZipFolders.Add(entry); 
    } 
    int foldersCount = listOfZipFolders.Count; 
} 

EDIT: vorherige Codebeispiele funktionieren nur mit leere Ordner.

dies wird eine Liste der Root-Ordner (leer, nicht leer oder mit Unterordner)

var folders = archive.Entries 
    .Where 
     (x => x.FullName.Split('/').Length > 1 || 
      x.FullName.EndsWith("/") 
     ) 
    .Select(f => f.FullName.Split('/')`[0]) 
    .Distinct() 
    .ToList(); 

var foldersCount = archive.Entries 
    .Where 
     (x => x.FullName.Split('/').Length > 1 || 
      x.FullName.EndsWith("/") 
     ) 
    .Select(f => f.FullName.Split('/')`[0]) 
    .Distinct() 
    .Count() 
+0

Es funktioniert immer noch nicht: Ich habe ein gültiges Archiv, das einen Stammordner mit 5 Ordnern enthält. 'foldersCount' = 6, nicht eine –

+2

Sie sollten Elemente zählen, die mit/enden und nur eine/ – RvdK

+0

. Sieht so aus, als ob mein Code nur mit leeren Ordnern funktioniert. Ich habe eine Version hinzugefügt, die mit allen Szenarien funktionieren sollte (ein oder mehrere Ordner im Stammverzeichnis, die __n__ Ordner und/oder Dateien enthalten). – Nino

1

Das Problem ist, dass die Einträge Liste ist flach zu finden. Aber mit diesem Filter sollten Sie in der Lage sein, die Anzahl der Root-Ordner zu ermitteln.

int foldersCount; 
using (var zip = ZipFile.OpenRead(file)) 
{ 
    foldersCount = zip.Entries.Count(e => e.FullName.Split('/').Length == 3 && e.FullName.EndsWith("/")); 
} 
+0

Leider funktioniert dies nicht, wenn zwei Stammordner vorhanden sind, einer leer und andere mit Dateien und Unterordnern. – Nino

+0

@Nino warum würde es nicht funktionieren? – soumer

+0

@Nino Ich habe es mit zwei Ordnern im Root getestet (eine leere, eine mit Unterordnern und Dateien). Es funktionierte. – soumer