Можно ли использовать System.IO.Packaging.Package для архивирования папки и добавления в нее файлов / папок? - PullRequest
4 голосов
/ 26 октября 2010

Интересно, можем ли мы использовать класс .net ZipPackage для архивирования папки в файл file.zip. А потом я хочу открыть file.zip и добавить в него больше файлов / папок. Возможно ли это?

[Изменить]

Я пытаюсь использовать нативную библиотеку .net, если это возможно

Ответы [ 6 ]

4 голосов
/ 26 октября 2010

Собственная библиотека не является чистой молнией, хотя ее можно использовать для архивирования файлов.Это добавляет дополнительный файл в корне вашего почтового индекса.Если вы не возражаете против этого дополнительного файла, используйте его.Существуют и другие библиотеки, которые выполняют архивирование надлежащим образом и являются более быстрыми, простыми в использовании и имеют различные функции: DotNetZip и SharpZipLib .

2 голосов
/ 26 октября 2010

Класс Package используется для обработки пакетов, который использует формат zip для хранения, но имеет специальные метафайлы, включенные в zip.Пакет - это zip, но все zip файлы не являются пакетами.Вы можете открыть пакет только с использованием класса Package, а не любого zip-файла.

Возможно, лучше использовать стороннюю библиотеку, поскольку вы не ограничены формой пакета.

1 голос
/ 09 ноября 2010

На основе http://weblogs.asp.net/albertpascual/archive/2009/05/18/creating-a-folder-inside-the-zip-file-with-system-io-packaging.aspx

Вот что я разработал, 2 подписи, чтобы вы могли создавать каталоги в своем zip-файле:

Imports System.IO
Imports System.IO.Packaging

Public Class clsCompression

    Const BUFFER_SIZE As Long = 4096

    Sub New()
    End Sub


    Public Function AddFileToZip(ByVal zipFilename As String, _
                                 ByVal fileToAdd As String, _
                                 ByVal directoryFile As String) As Boolean
        Dim trace As String = ""

        Try
            trace = String.Format("{0} AddFileToZip zipFilename: '{1}' fileToAdd: '{2}'{3}", _
                                  Now, zipFilename, fileToAdd, vbNewLine)
            Using zip As Package = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate)
                Dim destFilename As String = ".\" & directoryFile & "\" & Path.GetFileName(fileToAdd)
                Dim uri As Uri = PackUriHelper.CreatePartUri(New Uri(destFilename, UriKind.Relative))
                If zip.PartExists(uri) Then
                    zip.DeletePart(uri)
                End If
                Dim part As PackagePart = zip.CreatePart(uri, "", CompressionOption.Normal)
                Using fileStream As New FileStream(fileToAdd, FileMode.Open, FileAccess.Read)
                    Using dest As Stream = part.GetStream()
                        CopyStream(fileStream, dest)
                    End Using
                End Using
            End Using
            Return True

        Catch ex As Exception
            Return False
        End Try

    End Function

    Public Function AddFileToZip(ByVal zipFilename As String, ByVal fileToAdd As String) As Boolean
        Dim trace As String = ""

        Try
            trace = String.Format("{0} AddFileToZip zipFilename: '{1}' fileToAdd: '{2}'{3}", _
                                  Now, zipFilename, fileToAdd, vbNewLine)
            Using zip As Package = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate)
                Dim destFilename As String = ".\" & Path.GetFileName(fileToAdd)
                Dim uri As Uri = PackUriHelper.CreatePartUri(New Uri(destFilename, UriKind.Relative))
                If zip.PartExists(uri) Then
                    zip.DeletePart(uri)
                End If
                Dim part As PackagePart = zip.CreatePart(uri, "", CompressionOption.Normal)
                Using fileStream As New FileStream(fileToAdd, FileMode.Open, FileAccess.Read)
                    Using dest As Stream = part.GetStream()
                        CopyStream(fileStream, dest)
                    End Using
                End Using
            End Using
            Return True

        Catch ex As Exception
            Return False
        End Try

    End Function

    Private Sub CopyStream(ByVal inputStream As System.IO.FileStream, ByVal outputStream As System.IO.Stream)
        Dim bufferSize As Long = If(inputStream.Length < BUFFER_SIZE, inputStream.Length, BUFFER_SIZE)
        Dim buffer As Byte() = New Byte(CInt(bufferSize) - 1) {}
        Dim bytesRead As Integer = 0
        Dim bytesWritten As Long = 0
        While (InlineAssignHelper(bytesRead, inputStream.Read(buffer, 0, buffer.Length))) <> 0
            outputStream.Write(buffer, 0, bytesRead)
            bytesWritten += bufferSize
        End While
    End Sub

    Private Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T
        target = value
        Return value
    End Function

End Class
1 голос
/ 28 октября 2010

Спасибо всем!Любое ваше предложение очень полезно для меня.

Поскольку я предпочитаю использовать нативную библиотеку .net, я вкладываю себя в класс ZipPackage и через некоторое время пытаюсь ответить на мой собственный вопрос yes,

Наконец, я понял, как использовать его для добавления файла / папки в пакет.Вот моя модифицированная версия , которая была получена из образца на MSDN , что позволяет нам сделать это.

1 голос
/ 26 октября 2010

Вы можете использовать собственные классы Zip, предоставляемые библиотекой J #, все еще поддерживаемой в .NET - вам нужно добавить ссылку на vjslib в ваш проект, чтобы включить их.

Пример кода:

using java.io;
using java.util.zip;

...
private void ZipFile(string sourceFile, string targetName, ref ZipOutputStream zipout)
{
    // read the temporary file to a file source
    java.io.FileInputStream fileSourceInputStream = new java.io.FileInputStream(sourceFile);

    // create a zip entry
    ZipEntry ze = new ZipEntry(targetName);
    ze.setMethod(ZipEntry.DEFLATED);
    zipout.putNextEntry(ze);

    // stream the file to the zip
    CopyStream(fileSourceInputStream, zipout);
    zipout.closeEntry();

    // flush all data to the zip
    fileSourceInputStream.close();
    zipout.flush();
}

private static void CopyStream(java.io.InputStream from, java.io.OutputStream to)
{
    BufferedInputStream input = new BufferedInputStream(from);
    BufferedOutputStream output = new BufferedOutputStream(to);
    sbyte[] buffer = new sbyte[16384];
    int got;
    while ((got = input.read(buffer, 0, buffer.Length)) > 0)
    {
        output.write(buffer, 0, got);
    }
    output.flush();
}
0 голосов
/ 13 апреля 2019

Это можно сделать с помощью чистого .NET 3.0. Использование SharpZipLib может быть нежелательным из-за измененной лицензии GPL.

Для начала вам понадобится ссылка на WindowsBase.dll.

Этот код откроет или создаст zip-файл, создаст каталог внутри и поместит файл в этот каталог. Если вы хотите сжать папку, возможно, содержащую подкаталоги, вы можете перебрать файлы в каталоге и вызвать этот метод для каждого файла. Затем вы можете сначала выполнить поиск в подкаталогах файлов, вызвать метод для каждого из них и указать путь для создания этой иерархии в zip-файле.

public void AddFileToZip(string zipFilename, string fileToAdd, string destDir)
{
    using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate))
    {
        string destFilename = "." + destDir + "\\" + Path.GetFileName(fileToAdd);
        Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));
        if (zip.PartExists(uri))
        {
            zip.DeletePart(uri);
        }
        PackagePart part = zip.CreatePart(uri, "", CompressionOption.Normal);

        using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read))
        {
            using (Stream dest = part.GetStream())
            {
                CopyStream(fileStream, dest);
            }
        }
    }
}

destDir может быть пустой строкой, которая поместит файл прямо в zip.

Источники: https://weblogs.asp.net/jongalloway/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib

https://weblogs.asp.net/albertpascual/creating-a-folder-inside-the-zip-file-with-system-io-packaging

...