Comment décompresser tout.Fichier Zip du dossier en utilisant C # 4.0 et sans utiliser de Dll OpenSource?

j'ai un dossier contenant .ZIP files. Maintenant, je veux extraire les fichiers ZIP vers des dossiers spécifiques en utilisant C#, mais sans utiliser d'assemblage externe ou le .net Framework 4.5.

j'ai cherché, mais je n'ai trouvé aucune solution pour déballer *.fichiers zip à L'aide de la version 4.0 ou d'une version plus récente.

j'ai essayé GZipStream, mais il supporte seulement .gz et pas .les fichiers zip.

18
demandé sur John Willemse 2013-04-17 10:15:53

6 réponses

Ici est un exemple de msdn. System.IO.Compression.ZipFile est faite pour ça:

using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string startPath = @"c:\example\start";
            string zipPath = @"c:\example\result.zip";
            string extractPath = @"c:\example\extract";

            ZipFile.CreateFromDirectory(startPath, zipPath);

            ZipFile.ExtractToDirectory(zipPath, extractPath);
        }
    }
}

Edit: désolé, j'ai raté le fait que vous vous intéressiez à .NET 4.0 et en dessous. Obligatoire. cadre. net 4.5 et supérieur.

28
répondu Denys Denysenko 2016-05-30 16:13:19

j'avais la même question et j'ai trouvé un article grand et très simple qui résout le problème. http://www.fluxbytes.com/csharp/unzipping-files-using-shell32-in-c/

vous aurez besoin de faire référence à la Bibliothèque COM appelée Microsoft Shell Controls and Automation (Interop.Shell32.dll)

Le code (prises intact de l'article, juste pour que vous voyez comment il est simple):

public static void UnZip(string zipFile, string folderPath)
{
    if (!File.Exists(zipFile))
        throw new FileNotFoundException();

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

    Shell32.Shell objShell = new Shell32.Shell();
    Shell32.Folder destinationFolder = objShell.NameSpace(folderPath);
    Shell32.Folder sourceFile = objShell.NameSpace(zipFile);

    foreach (var file in sourceFile.Items())
    {
        destinationFolder.CopyHere(file, 4 | 16);
    }
}

je recommande vivement la lecture de l'article - il apporte une explication pour les drapeaux 4/16

EDIT: après plusieurs années que mon application, qui utilise ceci, a fonctionné, j'ai reçu des plaintes de deux utilisateurs que tout d'un coup l'application a cessé de fonctionner. il semble que la fonction CopyHere crée des fichiers/dossiers temp et ceux-ci n'ont jamais été supprimés ce qui a causé des problèmes. L'emplacement de ces fichiers peut être trouvé dans le système.IO.Chemin.GetTempPath ().

13
répondu TBD 2017-01-16 09:13:54

ZipPackage peut-être un endroit pour commencer. It's inside Système.IO.Emballage et disponible en .net 4.0

pas du tout proche de la simplicité de la méthode .net 4.5 mentionnée ci-dessus, mais on dirait qu'elle peut faire ce que vous voulez.

1
répondu Alex 2013-04-17 06:21:34

.NET 3.5 a un Déflatestream pour cela. Vous devez créer des structures pour les informations sur les répertoires et autres, mais PKWare a publié ces informations. J'ai écrit un utilitaire de décompression et il n'est pas particulièrement onéreux lors de la création de leurs structures.

0
répondu Michael Blake 2014-06-06 18:13:09

j'ai eu le même problème et je l'ai résolu en appelant 7-zip exécutable à travers cmd shell à partir de C# code, comme suit,

string zipped_path = "xxx.7z";
string unzipped_path = "yyy";
string arguments = "e " + zipped_path + " -o" + unzipped_path;

System.Diagnostics.Process process
         = Launch_in_Shell("C:\Program Files (x86)\7-Zip\","7z.exe", arguments);

if (!(process.ExitCode == 0))
     throw new Exception("Unable to decompress file: " + zipped_path);

Et Launch_in_Shell(...) est définie comme

public static System.Diagnostics.Process Launch_in_Shell(string WorkingDirectory,
                                                         string FileName, 
                                                         string Arguments)
{
       System.Diagnostics.ProcessStartInfo processInfo 
                                         = new System.Diagnostics.ProcessStartInfo();

        processInfo.WorkingDirectory = WorkingDirectory;
        processInfo.FileName = FileName;
        processInfo.Arguments = Arguments;
        processInfo.UseShellExecute = true;
        System.Diagnostics.Process process 
                                      = System.Diagnostics.Process.Start(processInfo);

        return process;
}

Drawbacks: vous devez avoir 7zip installé sur votre machine et je ne l'ai essayé qu'avec ".7z fichiers". Espérons que cette aide.

0
répondu josuapop 2014-11-06 17:46:51

dans .net 4.0 Deflate et GZip ne peuvent pas gérer les fichiers Zip, mais vous pouvez utiliser la fonction shell pour décompresser les fichiers.

public FolderItems Extract()
{
 var shell = new Shell();
 var sf = shell.NameSpace(_zipFile.Path);
 return sf.Items();
}

lorsque la fonction d'extrait est appelée, Vous pouvez sauver les folderItems retournés par

    FolderItems Fits = Extract();
    foreach( var s in Fits)
    {
       shell.Namespace("TargetFolder").copyhere(s); 

    }
-1
répondu ajaybhasy 2013-09-12 12:45:07