2012-10-08 2 views
2

Je développe une application wpf. J'utilise sharpziplib pour compresser et décompresser des fichiers. Je décompresse facilement les fichiers .zip en utilisant le code suivantComment décompresser le fichier .bz2 en C#?

public static void UnZip(string SrcFile, string DstFile, string safeFileName, int bufferSize) 
     { 
      //ICSharpCode.SharpZipLib.Zip.UseZip64.Off; 

      FileStream fileStreamIn = new FileStream(SrcFile, FileMode.Open, FileAccess.Read); 
      ZipInputStream zipInStream = new ZipInputStream(fileStreamIn); 


      string rootDirectory = string.Empty; 
      if (safeFileName.Contains(".zip")) 
      { 
       rootDirectory = safeFileName.Replace(".zip", string.Empty); 
      } 
      else 
      { 
       rootDirectory = safeFileName; 
      } 

      Directory.CreateDirectory(App.ApplicationPath + rootDirectory); 

      while (true) 
      { 
       ZipEntry entry = zipInStream.GetNextEntry(); 

       if (entry == null) 
        break; 

       if (entry.Name.Contains("/")) 
       { 
        string[] folders = entry.Name.Split('/'); 

        string lastElement = folders[folders.Length - 1]; 
        var folderList = new List<string>(folders); 
        folderList.RemoveAt(folders.Length - 1); 
        folders = folderList.ToArray(); 

        string folderPath = ""; 
        foreach (string str in folders) 
        { 
         folderPath = folderPath + "/" + str; 
         if (!Directory.Exists(App.ApplicationPath + rootDirectory + "/" + folderPath)) 
         { 
          Directory.CreateDirectory(App.ApplicationPath + rootDirectory + "/" + folderPath); 
         } 
        } 

        if (!string.IsNullOrEmpty(lastElement)) 
        { 
         folderPath = folderPath + "/" + lastElement; 
         WriteToFile(DstFile + rootDirectory + @"\" + folderPath, bufferSize, zipInStream, rootDirectory, entry); 
        } 

       } 
       else 
       { 
        WriteToFile(DstFile + rootDirectory + @"\" + entry.Name, bufferSize, zipInStream, rootDirectory, entry); 
       } 
      } 

      zipInStream.Close();   
      fileStreamIn.Close(); 
     } 

     private static void WriteToFile(string DstFile, int bufferSize, ZipInputStream zipInStream, string rootDirectory, ZipEntry entry) 
     { 
      FileStream fileStreamOut = new FileStream(DstFile, FileMode.OpenOrCreate, FileAccess.Write); 
      int size; 
      byte[] buffer = new byte[bufferSize]; 

      do 
      { 
       size = zipInStream.Read(buffer, 0, buffer.Length); 
       fileStreamOut.Write(buffer, 0, size); 
      } while (size > 0); 

      fileStreamOut.Close(); 
     } 

Mais le même code ne fonctionne pas avec les fichiers .bz2. Il donne une erreur à la ligne

ZipEntry entry = zipInStream.GetNextEntry(); 

L'erreur est - Mauvaise signature d'en-tête local: 0x26594131. Comment dois-je décompresser le fichier .bz2? Pouvez-vous s'il vous plaît me fournir tout code ou lien à travers lequel je peux résoudre le problème ci-dessus?

Répondre

3

Pendant que vous utilisez un ZipInputStream pour .zip fichiers, vous devez utiliser un BZip2InputStream pour .bz2 fichiers (et GZipInputStream pour .gz fichiers, etc.).

+0

pouvez-vous s'il vous plaît fournir le code en C#? –

+0

jeter un oeil à [cet] (http://www.codeproject.com/Articles/6834/MemoryStream-Compression) exemple – sloth

3

Contrairement à Zip (et RAR et tar), bz2 et gzip ne sont que des compresseurs de flux d'octets. Ils n'ont pas de concept de format de conteneur comme mentionné ci-dessus, et donc pourquoi il échoue sur GetNextEntry. (En d'autres termes, bz2 et gzip n'auront qu'une seule entrée au maximum).

+2

... d'où les extensions .tar.bz2 et .tar.gz ... l'archive tar soin du système de fichiers et le compresseur de flux compresse ce fichier tarball unique. +1 – spender

Questions connexes