web-dev-qa-db-fra.com

Comment décompresser tous les fichiers .Zip d'un dossier en utilisant C # 4.0 sans utiliser de DLL OpenSource?

J'ai un dossier contenant .Zip files . Maintenant, je veux extraire les fichiers Zip dans des dossiers spécifiques en utilisant C #, mais sans utiliser d’Assembly externe ni de .Net Framework 4.5.

J'ai effectué une recherche mais je n'ai pas trouvé de solution pour décompresser les fichiers * .Zip à l'aide de Framework 4.0 ou version ultérieure.

J'ai essayé GZipStream, mais il ne supporte que les fichiers .gz et non les fichiers .zip.

18
SHEKHAR SHETE

Voici un exemple de msdn . System.IO.Compression.ZipFile est fait juste 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 oublié que vous vous intéressiez à .NET 4.0 et versions inférieures . Obligatoire .NET Framework 4.5 et versions supérieures.

30
Denys Denysenko

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

vous devrez référencer la bibliothèqueCOM appelée Microsoft Shell Controls And Automation (Interop.Shell32.dll)

Le code (extrait de l'article juste pour voir à quel point c'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);
    }
}

recommande vivement de lire l'article - il apporte une explication pour les drapeaux 4 | 16

EDIT: après que mon application, qui utilise cette application, fonctionnait, cela faisait plusieurs années que deux utilisateurs se plaignaient de ce que l'application cessait tout à fait de fonctionner . Il semble que la fonction CopyHere crée des fichiers temporaires/Les dossiers et ceux-ci n'ont jamais été supprimés, ce qui a posé des problèmes . L'emplacement de ces fichiers se trouve dans System.IO.Path.GetTempPath ().

14
TBD

ZipPackage pourrait être un endroit pour commencer. C'est à l'intérieur de System.IO.Packaging et disponible dans .NET 4.0

Pas si loin 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
Alex

vous pouvez utiliser DotNetZip (open source) `

string zipFilePath = "C:\\sample.Zip";
string extractedFilePath = "C:\\sampleFolder";

ZipFile zipfile = ZipFile.Read(zipFilePath); 
if (!Directory.Exists(extractedFilePath))
    Directory.CreateDirectory(extractedFilePath); 

foreach (ZipEntry e in zipfile)
{
        e.Extract(extractedFilePath,ExtractExistingFileAction.OverwriteSilently);
}`
0
engntsn

.NET 3.5 a un DeflateStream 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 lourd une fois que vous avez créé les structures correspondantes.

0
Michael Blake

J'ai eu le même problème et l'ai résolu en appelant l'exécutable 7-Zip via cmd Shell à partir de code C #, 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 où Launch_in_Shell(...) est défini 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;
}

Inconvénients: Vous devez avoir installé 7Zip sur votre ordinateur et je l’ai seulement essayé avec les fichiers ".7z". J'espère que cela t'aides.

0
josuapop