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

StackOverflow https://stackoverflow.com/questions/1023476

  •  06-07-2019
  •  | 
  •  

Question

Ne pas décompresser un fichier zip par une bibliothèque / API intégrée en C #. Je recherche une bibliothèque / API gratuite (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.

Une bibliothèque / API ou des échantillons recommandés?

Était-ce utile?

La solution

La GPL

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

OU le Ms-PL moins restrictif

http://www.codeplex.com/DotNetZip

Pour compléter cette réponse, le framework .net a ZipPackage J'ai eu moins de succès avec cela.

Autres conseils

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 Shell Windows. J'ai utilisé dynamic à partir de Framework 4.0 dans cet exemple, mais vous pouvez obtenir les mêmes résultats avec 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 du . Méthode CopyHere .

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, ou si vous souhaitez contrôler les noms de chemin des fichiers extraits, etc., etc., beaucoup d'options. Consultez le fichier d'aide pour plus d'exemples.

DotNetZip est gratuit et open source.

Dans le passé, j’utilisais DotNetZip (MS-PL), SharpZipLib (GPL), et le 7ZIP SDK 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 provenant du C #. Exemples de page :

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  foreach (ZipEntry e in zip)
  {
    e.Extract(TargetDirectory);
  }
}

Consultez ma petite bibliothèque: http://zipstorer.codeplex.com

Si vous souhaitez utiliser la compression 7-zip, consultez la page Article d'EggheadCafe . Attention: le le code source LZMA pour c # n'a pas de commentaire xml (en fait, très peu de commentaires du tout).

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, reportez-vous à: http: / /msdn.microsoft.com/en-us/magazine/cc163372.aspx Il existe un exemple de fichier sous la figure 13 de l'article.

  • 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 ().

    #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

Je préférerais SharpZiplib S'il vous plaît trouver l'exemple de code à Unzip Files in. Net C #

Je recommanderais notre http://www.rebex.net/zip.net/ mais je suis partial. Téléchargez la version d'évaluation et vérifiez les fonctionnalités et les exemples vous-même.

SevenZipSharp est un wrapper autour de tha 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(...);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top