Как распаковать все.ZIP-файл из папки, используя C# 4.0 и без использования OpenSource Dll?

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

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

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

6 ответов

Вот пример из 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 Framework 4.5 и выше.

У меня был тот же вопрос и я нашел отличную и очень простую статью, которая решает проблему. 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

РЕДАКТИРОВАТЬ: после нескольких лет работы моего приложения, которое использует это, я получил жалобы от двух пользователей, что внезапно приложение перестало работать. похоже, что функция CopyHere создает временные файлы / папки, и они никогда не удалялись, что вызывало проблемы. Расположение этих файлов можно найти в System.IO.Path.GetTempPath().

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

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

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

Вы можете использовать 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-zip через командную оболочку cmd из кода C# следующим образом:

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". Надеюсь это поможет.

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

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

При вызове функции извлечения вы можете сохранить возвращенные папки

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

    }
Другие вопросы по тегам