2015-06-23 62 views
0

我還是更好的,我們有一個大問題! 我們最喜歡的遊戲Trove改變了它的結構,使其更具可修改性。現在我們坐在我們的ModLoader上,不知道如何更新它。它應該保留舊的結構,但它需要將文件夾應用於zips根目錄中的每個現有文件夾。讓我告訴你:Ionic Zip:提取文件夾的zip文件

mod.zip 
|-blueprints 
| |-fileA 
| 
|-particles 
| |-fileB 

它提取到每個Live /藍圖/清除/ ...和現場/顆粒/清除/ ...(這僅僅是一個例子......在真實mod,還有更多文件夾和更多文件)

我該怎麼做?離子是可能的嗎?或者我必須使用其他庫嗎?

+0

你想提取一個zip並保持目錄結構? –

+0

好吧,有點...壓縮文件夾中的內容應該被提取到實際文件夾中的文件夾。所以在我的例子中,mod.zip/blueprints/fileA必須被提取到Live/blueprints/override/fileA並且mod.zip /particles/fileB必須被提取到Live/particles/override/fileB –

回答

0

當然,像這樣的東西應該工作,如果我明白你需要什麼。

private const string ZIP_FILE = @"c:\temp\mod.zip"; 

static void Main() 
{ 
    // delete if already there 
    File.Delete(ZIP_FILE); 

    // create example zip file 
    using(ZipFile zipToPack = new ZipFile(ZIP_FILE)) 
    { 
     File.WriteAllText(@"c:\temp\fileA.txt", "This is file A"); 
     zipToPack.AddFile(@"c:\temp\fileA.txt", "blueprints"); 
     File.WriteAllText(@"c:\temp\fileB.txt", "This is file B"); 
     zipToPack.AddFile(@"c:\temp\fileB.txt", "particles"); 
     zipToPack.Save(); 
    } 

    // extract inserting extra directory 
    string baseExtractDir = @"c:\temp\LIVE"; 
    string overrideDir = "override"; 

    using (ZipFile zipToUnpack = new ZipFile(ZIP_FILE)) 
    { 
     // loop through each entry in the zip file 
     foreach (var zipEntry in zipToUnpack) 
     {      
      if (zipEntry.IsDirectory) continue; 
      string zipDirectoryPath = Path.GetDirectoryName(zipEntry.FileName); 
      // create the target file path as follows: 
      // ("c:\temp\LIVE") + zip file path ("blueprints") + our extra path ("override") + zip file name ("fileA.txt") 
      string targetExtractFile = Path.Combine(baseExtractDir, zipDirectoryPath, overrideDir, Path.GetFileName(zipEntry.FileName)); 
      // create the directory path if needed 
      string targetExtractDir = Path.GetDirectoryName(targetExtractFile); 
      if (!Directory.Exists(targetExtractDir)) Directory.CreateDirectory(targetExtractDir); 
      // extract the zip file to our target file name 
      using (FileStream stream = new FileStream(targetExtractFile, FileMode.Create)) 
       zipEntry.Extract(stream); 
     } 
    } 

    Console.ReadKey(); 
} 
+0

您是否認爲這樣會有子文件夾時也工作嗎? 示例: 顆粒/ VFX/FILEA, 顆粒/動畫/ FILEB, 藍圖/ FileC 等 –

+0

是,儘管在這種情況下,將提取到'顆粒\ VFX \倍率\ fileA'。如果你想讓你的額外路徑高於鏈條,它可以做不同的事情。 – steve16351

+0

好吧,它不工作...它只是創建一個名爲覆蓋的文件(但它在正確的目錄中) 編輯:這是它看起來像http://pastebin.com/pK0Z6e6S(忽略消息框.. 。只是調試) –