Архивировать и распаковывать файлы

Я программист, использующий VS2012. Я хочу разархивировать zip-файл (созданный с помощью Winzip, filzip или других программ сжатия zip), а затем также иметь возможность заархивировать файлы обратно в zip-файл.

Какую библиотеку лучше всего использовать для этого, и могу ли я получить пример кода о том, как использовать библиотеку?

ИЗМЕНИТЬ

Я использую VB.net, вот мой код:

Public Function extractZipArchive() As Boolean
    Dim zipPath As String = "c:\example\start.zip"
    Dim extractPath As String = "c:\example\extract"

    Using archive As ZipArchive = ZipFile.OpenRead(zipPath)
        For Each entry As ZipArchiveEntry In archive.Entries
            If entry.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase) Then
                entry.ExtractToFile(Path.Combine(extractPath, entry.FullName))
            End If
        Next
    End Using
End Function

Какие операторы импорта мне нужно использовать? На данный момент я добавил следующее:

Imports System.IO
Imports System.IO.Compression

Я получаю сообщение об ошибке:

Тип «ZipArchive» не определен

Как я могу исправить эту ошибку?


person Darryl Janecek    schedule 18.08.2012    source источник
comment
Он встроен в структуру: codeproject. .com/Articles/381661/   -  person ta.speot.is    schedule 18.08.2012


Ответы (4)


Если вы используете Visual Studio 2012 и .NET Framework 4.5, вы можете использовать новую библиотеку сжатия:

//This stores the path where the file should be unzipped to,
//including any subfolders that the file was originally in.
string fileUnzipFullPath;

//This is the full name of the destination file including
//the path
string fileUnzipFullName;

//Opens the zip file up to be read
using (ZipArchive archive = ZipFile.OpenRead(zipName))
{
    //Loops through each file in the zip file
    foreach (ZipArchiveEntry file in archive.Entries)
    {
        //Outputs relevant file information to the console
        Console.WriteLine("File Name: {0}", file.Name);
        Console.WriteLine("File Size: {0} bytes", file.Length);
        Console.WriteLine("Compression Ratio: {0}", ((double)file.CompressedLength / file.Length).ToString("0.0%"));

        //Identifies the destination file name and path
        fileUnzipFullName = Path.Combine(dirToUnzipTo, file.FullName);

        //Extracts the files to the output folder in a safer manner
        if (!System.IO.File.Exists(fileUnzipFullName))
        {
            //Calculates what the new full path for the unzipped file should be
            fileUnzipFullPath = Path.GetDirectoryName(fileUnzipFullName);

            //Creates the directory (if it doesn't exist) for the new path
            Directory.CreateDirectory(fileUnzipFullPath);

            //Extracts the file to (potentially new) path
            file.ExtractToFile(fileUnzipFullName);
        }
    }
}
person ta.speot.is    schedule 18.08.2012
comment
Спасибо. На самом деле я использую VB.net (извините, что должен был это указать). Не могли бы вы взглянуть на мой отредактированный пост? - person Darryl Janecek; 18.08.2012
comment
Кроме того, могу ли я получить некоторую помощь с кодом для создания zip-файла, а затем добавить в него файлы? - person Darryl Janecek; 18.08.2012
comment
Вы можете запустить его код через конвертер кода, и он сделает большую часть работы за вас (они всегда точны на 100%, но они помогут вам в большинстве случаев). Я использую это при конвертации фрагментов для сообщений в блоге: converter.telerik.com - person b.pell; 18.08.2012

Остался без ответа, хотя и некоторое время назад, поэтому я все равно вложу туда свои 0,02 доллара для всех, кто наберет это по ключевым словам...

В VB 2012 (.Net 4.5) в System.IO.Compression (System.IO.Compression.FileSystem.dll) добавлены новые функции, которые будут делать то, что вам нужно. Раньше у нас был только GZip. Вы по-прежнему можете использовать бесплатный архив DotNetZip или SharpZipLib, конечно.

Класс ZipFile имеет 2 статических метода, которые делают простое сжатие/распаковку невероятно простым: CreateFromDirectory и ExtractToDirectory. У вас также есть варианты сжатия: Без сжатия, Самое быстрое и Оптимальное.

Одна вещь, которая поразила меня в вашем посте, это концепция файлов (даже архивов) внутри архивов. С помощью классов ZipArchive и ZipArchiveEntry теперь вы можете

ZipАрхив:

Using zippedFile as ZipArchive = ZipFile.Open("foo.zip", ZipArchiveMode.Read)
    For Each ntry as ZipArchiveEntry In zippedFile.Entries
        Debug.Writeline("entry " & ntry.FullName & " is only " & ntry.CompressedLength.ToString)
    Next
End Using

Ваш вопрос также касался добавления в существующий архив. Теперь вы можете сделать это следующим образом:

Using zippedFile as ZipArchive = ZipFile.Open("foo.zip", ZipArchiveMode.Update)
    zippedFile.createEntry("bar.txt", CompressionLevel.Fastest)
    ' likewise you can get an entry already in there...
    Dim ntry As ZipArchiveEntry = zippedFile.GetEntry("wtf.doc")
    ' even delete an entry without need to decompress & compress again!
    ntry.Delete() ' !
End Using

Опять же, это было давно, но многие из нас до сих пор используют 2012, и, поскольку это изменение никуда не денется в будущих версиях, оно все равно должно оказаться полезным для продвижения вперед, если кто-то наткнется на поиск по ключевому слову/тегу. .

...и мы даже не говорили о поддержке UTF-8!

person Compassionate Narcissist    schedule 29.04.2014

Вероятно, вы не имеете в виду System.IO.Compression. Установите флажок для этой ссылки на сборку, и это должно устранить ошибку.

person Stephen D.    schedule 07.08.2014

Как указано в https://msdn.microsoft.com/en-us/library/system.io.compression.zipfile(v=vs.110).aspx

Вы можете использовать ZipFile.ExtractToDirectory и CreateFromDirectory.

Вот пример:

Импортирует System.IO

Импортирует System.IO.Compression

Модуль Модуль1

Подоснова()

   Dim startPath As String = "c:\example\start"
   Dim zipPath As String = "c:\example\result.zip"
   Dim extractPath As String = "c:\example\extract"

   ZipFile.CreateFromDirectory(startPath, zipPath)
   ZipFile.ExtractToDirectory(zipPath, extractPath)

Конец сабвуфера

Конечный модуль

Убедитесь, что вы ссылаетесь на System.IO.Compression.FileSystem для использования этой функции.

person Samuel Surya    schedule 04.12.2017