2016-04-01 19 views
2

koruyarak ZIP belirli dizin ayıklamak bunu yaparken disk, ama ben klasör yapısını perserve veremiyoruz ve bunun yerineC# Bir zip arşivi ve bir arşiv içinde klasör yapısına sahip şuna benzer klasör yapısını

- fileA.txt 
    + dirB 
    - fileB.txt 

I

- fileA.txt 
    - fileB.txt 
olsun Ben Path.Combine() yerine entry.FullName arasında entry.Name kullanmak nedeni de oldukça olumlu değilim, ama FullName kullanmak olsaydı, ben kök dizin dirA Ben yolunda olurdu

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); 
    } 
} 

:

İşte benim kod ayıklamamak için çalışıyor. Yani buradan bir duvara isabet ettik ve aklınıza gelebilecek tek çözüm ile tüm zip ayıklanması edilir:

ZipFile.ExtractToDirectory(archivePath, extractPath); 

... sonra farklı bir yere dirA gelen alt klasörleri taşıma ve dirA silme. Hangisi en şanslı fikirlere benzemiyor.

Herhangi bir yardım

çok takdir edilmektedir.

cevap

3

Sadece istemek sen değilsin yolun bir parçası tarafından FullName kısaltabilir:

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

Neden bu harika bir çözüm olduğunu ve şimdi kadar mükemmel bariz görünüyor! Teşekkürler. – nn2202