Как распаковать все .Zip файлы из папки с помощью С# 4.0 и без использования OpenSource Dll?

У меня есть папка, содержащая .ZIP файлы. Теперь я хочу извлечь ZIP файлы в определенные папки с помощью С#, но без использования какой-либо внешней сборки или .NET Framework 4.5.

Я искал, но не нашел решения для распаковки *.zip файлов с использованием Framework 4.0 или ниже.

Я попробовал GZipStream, но он поддерживает только файлы .gz, а не .zip.

Ответ 1

Вот пример из msdn. System.IO.Compression.ZipFile выполняется только для этого:

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);
        }
    }
}

Изменить: Извините, я пропустил, что вы заинтересованы в .NET 4.0 и ниже. Обязательная среда .NET 4.5 и выше.

Ответ 2

У меня был такой же вопрос, и я нашел замечательную и очень простую статью, которая решает проблему. http://www.fluxbytes.com/csharp/unzipping-files-using-shell32-in-c/

вам нужно будет ссылаться на COM-библиотека под названием Microsoft Shell Controls and Automation (Interop.Shell32.dll)

Код (снятый из статьи только для того, чтобы вы поняли, насколько это просто):

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);
    }
}

настоятельно рекомендую прочитать статью - он приводит объяснение для флагов 4 | 16

EDIT: после нескольких лет работы моего приложения, которое использует это, у меня появились жалобы от двух пользователей, которые внезапно перестали работать. похоже, что функция CopyHere создает временные файлы/папки, и они никогда не удалялись, что вызывало проблемы. Местоположение этих файлов можно найти в System.IO.Path.GetTempPath().

Ответ 3

ZipPackage может быть местом для начала. Он находится внутри System.IO.Packaging и доступен в .NET 4.0

Не где-то рядом с простотой упомянутого выше метода .NET 4.5, но похоже, что он может делать то, что вы хотите.

Ответ 4

В .NET 3.5 для этого используется DeflateStream. Вы должны создавать структуры для информации о каталогах и т.д., Но PKWare опубликовала эту информацию. Я написал утилиту unzip, и это не является особенно обременительным, как только вы создадите для него структуры.

Ответ 5

У меня была такая же проблема, и я решил ее, вызвав 7-zip-исполняемый файл через CMD-оболочку из кода С# следующим образом:

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);

И где Launch_in_Shell(...) определяется как,

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;
}

Недостатки: вам необходимо установить 7zip на вашем компьютере, и я только пробовал его с файлами ".7z". Надеюсь, это поможет.

Ответ 6

Вы можете использовать DotNetZip (с открытым исходным кодом) '

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);
}'

Ответ 7

В .net 4.0 Deflate и GZip не могут обрабатывать Zip файлы, но вы можете использовать функцию оболочки для распаковки файлов.

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

Когда вызывается функция Function, вы можете сохранить возвращенные элементы папки

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

    }