web-dev-qa-db-fra.com

recommander une bibliothèque/API pour décompresser un fichier en C #

Ne ressemble à aucune bibliothèque/API intégrée en C # pour décompresser un fichier Zip. Je cherche une bibliothèque/API libre (meilleure open source) qui pourrait fonctionner avec .Net 3.5 + VSTS 2008 + C # pour décompresser un fichier Zip et extraire tous les fichiers dans un dossier spécifique.

Toute bibliothèque/API ou exemples recommandés?

47
George2

La GPL 

http://www.icsharpcode.net/OpenSource/SharpZipLib/

OU le moins restrictif Ms-PL

http://www.codeplex.com/DotNetZip

Pour compléter cette réponse, le framework .net a ZipPackage j’ai eu moins de succès. 

34
Sam Saffron

Si vous souhaitez simplement décompresser le contenu d'un fichier dans un dossier et savoir que vous ne l'exécuterez que sous Windows, vous pouvez utiliser l'objet Windows Shell. J'ai utilisé dynamic de Framework 4.0 dans cet exemple, mais vous pouvez obtenir les mêmes résultats en utilisant Type.InvokeMember.

dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));

dynamic compressedFolderContents = shellApplication.NameSpace(sourceFile).Items;
dynamic destinationFolder = shellApplication.NameSpace(destinationPath);

destinationFolder.CopyHere(compressedFolderContents);

Vous pouvez utiliser FILEOP_FLAGS pour contrôler le comportement de la méthode CopyHere.

24
Simon MᶜKenzie

DotNetZip est facile à utiliser. Voici un exemple de décompression

using (var Zip = Ionic.Zip.ZipFile.Read("archive.Zip"))
{
   Zip.ExtractAll("unpack-directory");
}

Si vous avez des besoins plus complexes, par exemple si vous voulez choisir les entrées à extraire, s'il existe des mots de passe, si vous souhaitez contrôler les noms de chemin des fichiers extraits, etc., etc., vous disposez de nombreuses options. . Consultez le fichier d'aide pour plus d'exemples. 

DotNetZip est gratuit et open source.

17
Cheeso

Dans le passé, j’utilisais DotNetZip (MS-PL), SharpZipLib (GPL) et le SDK 7Zip pour C # (domaine public). Ils fonctionnent tous très bien et sont open source. 

Je choisirais DotNetZip dans cette situation, et voici un exemple de code de la page Exemples C # :

using (ZipFile Zip = ZipFile.Read(ExistingZipFile))
{
  foreach (ZipEntry e in Zip)
  {
    e.Extract(TargetDirectory);
  }
}
10
Maxim Zaslavsky
7
Henri

Jetez un coup d’œil à ma petite bibliothèque: http://zipstorer.codeplex.com

4
Jaime Olivares

Si vous souhaitez utiliser la compression 7-Zip, consultez l'article EggheadCafe de Peter Bromberg . Attention: le le code source de LZMA for c # n'a pas de commentaire xml (en fait, très peu de commentaires du tout).

2
C-Pound Guru
    #region CreateZipFile
    public void StartZip(string directory, string zipfile_path)
    {
        Label1.Text = "Please wait, taking backup";
            #region Taking files from root Folder
                string[] filenames = Directory.GetFiles(directory);

                // path which the Zip file built in 
                ZipOutputStream p = new ZipOutputStream(File.Create(zipfile_path));
                foreach (string filename in filenames)
                {
                    FileStream fs = File.OpenRead(filename);
                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    ZipEntry entry = new ZipEntry(filename);
                    p.PutNextEntry(entry);
                    p.Write(buffer, 0 , buffer.Length);
                    fs.Close();
                }
            #endregion

            string dirName= string.Empty;
            #region Taking folders from root folder
                DirectoryInfo[] DI = new DirectoryInfo(directory).GetDirectories("*.*", SearchOption.AllDirectories);
                foreach (DirectoryInfo D1 in DI)
                {

                    // the directory you need to Zip 
                    filenames = Directory.GetFiles(D1.FullName);
                    if (D1.ToString() == "backup")
                    {
                        filenames = null;
                        continue;
                    }
                    if (dirName == string.Empty)
                    {
                        if (D1.ToString() == "updates" || (D1.Parent).ToString() == "updates" || (D1.Parent).Parent.ToString() == "updates" || ((D1.Parent).Parent).Parent.ToString() == "updates" || (((D1.Parent).Parent).Parent).ToString() == "updates" || ((((D1.Parent).Parent).Parent)).ToString() == "updates")
                        {
                            dirName = D1.ToString();
                            filenames = null;
                            continue;
                        }
                    }
                    else
                    {
                        if (D1.ToString() == dirName) ;
                    }
                    foreach (string filename in filenames)
                    {
                        FileStream fs = File.OpenRead(filename);
                        byte[] buffer = new byte[fs.Length];
                        fs.Read(buffer, 0, buffer.Length);
                        ZipEntry entry = new ZipEntry(filename);
                        p.PutNextEntry(entry);
                        p.Write(buffer, 0, buffer.Length);
                        fs.Close();
                    }
                    filenames = null;
                }
                p.SetLevel(5);
                p.Finish();
                p.Close();
           #endregion
    }
    #endregion

    #region EXTRACT THE Zip FILE
    public bool UnZipFile(string InputPathOfZipFile, string FileName)
    {
        bool ret = true;
        Label1.Text = "Please wait, extracting downloaded file";
        string zipDirectory = string.Empty;
        try
        {
            #region If Folder already exist Delete it
            if (Directory.Exists(Server.MapPath("~/updates/" + FileName))) // server data field
            {
                String[] files = Directory.GetFiles(Server.MapPath("~/updates/" + FileName));//server data field
                foreach (var file in files)
                    File.Delete(file);
                Directory.Delete(Server.MapPath("~/updates/" + FileName), true);//server data field
            }
            #endregion


            if (File.Exists(InputPathOfZipFile))
            {
                string baseDirectory = Path.GetDirectoryName(InputPathOfZipFile);

                using (ZipInputStream ZipStream = new

                ZipInputStream(File.OpenRead(InputPathOfZipFile)))
                {
                    ZipEntry theEntry;
                    while ((theEntry = ZipStream.GetNextEntry()) != null)
                    {
                        if (theEntry.IsFile)
                        {
                            if (theEntry.Name != "")
                            {
                                string directoryName = theEntry.Name.Substring(theEntry.Name.IndexOf(FileName)); // server data field

                                string[] DirectorySplit = directoryName.Split('\\');
                                for (int i = 0; i < DirectorySplit.Length - 1; i++)
                                {
                                    if (zipDirectory != null || zipDirectory != "")
                                        zipDirectory = zipDirectory + @"\" + DirectorySplit[i];
                                    else
                                        zipDirectory = zipDirectory + DirectorySplit[i];
                                }
                                string first = Server.MapPath("~/updates") + @"\" + zipDirectory;
                                if (!Directory.Exists(first))
                                    Directory.CreateDirectory(first);


                                string strNewFile = @"" + baseDirectory + @"\" + directoryName;


                                if (File.Exists(strNewFile))
                                {
                                    continue;
                                }
                                zipDirectory = string.Empty;

                                using (FileStream streamWriter = File.Create(strNewFile))
                                {
                                    int size = 2048;
                                    byte[] data = new byte[2048];
                                    while (true)
                                    {
                                        size = ZipStream.Read(data, 0, data.Length);
                                        if (size > 0)
                                            streamWriter.Write(data, 0, size);
                                        else
                                            break;
                                    }
                                    streamWriter.Close();
                                }
                            }
                        }
                        else if (theEntry.IsDirectory)
                        {
                            string strNewDirectory = @"" + baseDirectory + @"\" +

                            theEntry.Name;
                            if (!Directory.Exists(strNewDirectory))
                            {
                                Directory.CreateDirectory(strNewDirectory);
                            }
                        }
                    }
                    ZipStream.Close();
                }
            }
        }
        catch (Exception ex)
        {
            ret = false;
        }
        return ret;
    }  
    #endregion
1
Asif

Si vous ne souhaitez pas utiliser de composant externe, voici le code que j'ai développé la nuit dernière à l'aide de la classe ZipPackage de .NET.

private static void Unzip()
{
    var zipFilePath = "c:\\myfile.Zip";
    var tempFolderPath = "c:\\unzipped";

    using (Package pkg = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read))
    {
        foreach (PackagePart part in pkg.GetParts())
        {
            var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/')));
            var targetDir = target.Remove(target.LastIndexOf('\\'));

            if (!Directory.Exists(targetDir))
                Directory.CreateDirectory(targetDir);

            using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read))
            {
                CopyStream(source, File.OpenWrite(target));
            }
        }
    }
}

private static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[4096];
    int read;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, read);
    }
} 

Choses à noter:

  • L'archive Zip DOIT avoir un fichier [Content_Types] .xml à la racine. Ce n'était pas un problème pour mes besoins car je contrôlerai la compression de tous les fichiers Zip extraits par ce code. Pour plus d'informations sur le fichier [Content_Types] .xml, veuillez consulter: http://msdn.Microsoft.com/en-us/magazine/cc163372.aspx Il existe un fichier d'exemple sous la figure 13 .

  • Je n'ai pas testé la méthode CopyStream pour s'assurer qu'elle se comporte correctement, car je l'avais initialement développée pour .NET 4.0 à l'aide de la méthode Stream.CopyTo ().

1
Joshua

SevenZipSharp est un wrapper autour de 7z.dll et du SDK LZMA, qui est Open-source et gratuit. 

SevenZipCompressor compressor = new SevenZipCompressor(); 
compressor.CompressionLevel = CompressionLevel.Ultra;
compressor.CompressionMethod = CompressionMethod.Lzma;
compressor.CompressionMode = CompressionMode.Create;
compressor.CompressFiles(...);
0
d.popov

Je recommanderais notre http://www.rebex.net/Zip.net/ mais je suis partial. Téléchargez essayez et vérifiez vous-même les fonctions et les exemples.

0
Martin Vobr

Je préférerais SharpZiplib Veuillez trouver l'exemple de code pour UnZip Files in .Net C #

0
logiclabz