2016-04-01 4 views
2

Ich habe ein ZIP-Archiv und die Ordnerstruktur innerhalb eines Archivs sieht ungefähr so ​​aus:C# - extrahieren bestimmten Verzeichnis aus ZIP, Ordnerstruktur zu bewahren

+ dirA 
    - fileA.txt 
    + dirB 
    - fileB.txt 

Ich versuche, den Inhalt von dirA zu extrahieren Scheibe, aber während dies zu tun, ich bin nicht in der Lage, die Ordnerstruktur, und statt

- fileA.txt 
    + dirB 
    - fileB.txt 

I

- fileA.txt 
    - fileB.txt 
bekommen perserve

Hier ist mein Code:

using (ZipArchive archive = ZipFile.OpenRead(archivePath)) // archivePath is path to the zip archive 
{ 
    // get the root directory 
    var root = archive.Entries[0]?.FullName; 
    if (root == null) { 
     // quit in a nice way 
    } 
    var result = from curr in archive.Entries 
       where Path.GetDirectoryName(curr.FullName) != root 
       where !string.IsNullOrEmpty(curr.Name) 
       select curr; 

    foreach (ZipArchiveEntry entry in result) 
    { 
     string path = Path.Combine(extractPath, entry.Name); // extractPath is somwhere on the disk 
     entry.ExtractToFile(path); 
    } 
} 

ich ziemlich sicher bin, das ist, weil ich entry.Name statt entry.FullName in Path.Combine() verwenden, aber wenn ich FullName verwenden wäre, würde ich in Weg, die Root-Verzeichnis dirA Ich habe bin versuchen, nicht zu extrahieren. Also habe ich eine Mauer hier treffen, und die einzige Lösung, die ich denken kann, ist die gesamte ZIP-Extraktion mit:

ZipFile.ExtractToDirectory(archivePath, extractPath); 

... und dann von dirA an einen anderen Ort die Unterordner Verschieben und Löschen von dirA. Was nicht wie die glücklichsten Ideen aussieht.

Jede Hilfe wird sehr geschätzt.

Antwort

3

Sie könnten nur den Fullnamen durch den Teil des Pfades verkürzen Sie nicht wollen:

foreach (ZipArchiveEntry entry in result) 
{ 
    var newName = entry.FullName.Substring(root.Length); 
    string path = Path.Combine(extractPath, newName); 

    if (!Directory.Exists(path)) 
     Directory.CreateDirectory(Path.GetDirectoryName(path)); 

    entry.ExtractToFile(path); 
} 
+0

Warum, das ist eine große Abhilfe und es scheint jetzt so klar auf der Hand! Vielen Dank. – nn2202

Verwandte Themen