Question

I have a directory that contains several files. I want to compress this folder to a zip (using Xceed third party dll library) and push to user through HTTP. At the same time I would like to create a log of all the files inside the folder and append that as part of the compressed file.

I am currently using DotNetZip and its working perfectly. I need the equivalant of this in Xceed.

Below is the code using DotNetZip

Imports Ionic.Zip

   ' Tell the browser we're sending a ZIP file!
    Dim downloadFileName As String = String.Format("YourDownload-{0}.zip", DateTime.Now.ToString("yyyy-MM-dd-HH_mm_ss"))
    Response.ContentType = "application/zip"
    Response.AddHeader("Content-Disposition", "filename=" & downloadFileName)
' Zip the contents of the selected files
Using zip As New ZipFile()

    ' Construct the contents of the README.txt file that will be included in this ZIP
    Dim readMeMessage As String = String.Format("Your ZIP file {0} contains the following files:{1}{1}", downloadFileName, Environment.NewLine)

    For i As Integer = 0 To MainDirs.Length - 1
        readMeMessage &= String.Concat(vbTab, "* ", MainDirs(i), Environment.NewLine)
        ' Now add the file to the ZIP (use a value of "" as the second parameter to put the files in the "root" folder)
        zip.AddFile(MainDirs(i), "Your Files")
    Next

    ' Add the README.txt file to the ZIP
    zip.AddEntry("README.txt", readMeMessage, Encoding.ASCII)

    ' Send the contents of the ZIP back to the output stream
    zip.Save(Response.OutputStream)
End Using
End Sub
Was it helpful?

Solution

After back and forth emails with Xceed support. They were very kind to help me find the right solution for the problem.

Here is the code which works fine.

' Tell the browser we're sending a ZIP file!
        Dim downloadFileName As String = String.Format("YourDownload-{0}.zip", DateTime.Now.ToString("yyyy-MM-dd-HH_mm_ss"))
        Response.ContentType = "application/zip"
        Response.AddHeader("Content-Disposition", "filename=" & downloadFileName)

    Dim itemHeader As New ZipItemLocalHeader()

    ' Zip the contents of the selected files
    Using zip As New ZipWriter(Response.OutputStream)

        Dim directoryInfo As New DirectoryInfo(folderpath)
        If directoryInfo.Exists Then

            ' Construct the contents of the README.txt file that will be included in this ZIP
            Dim readMeMessage As String = String.Format("Your ZIP file {0} contains the following " & MainDirs.Length & " files:{1}{1}", downloadFileName, Environment.NewLine)

            'Get files in the current directory and all subdirectories.
            Dim _files As FileInfo() = directoryInfo.GetFiles("*.*", SearchOption.AllDirectories)

            Dim buffer As Byte() = New Byte(65536) {}

            Dim count As Integer = 0
            For Each file As FileInfo In _files
                'Create ZipItemLocalHeader for current item and write to archive.
                Dim zipItemLocalHeader1 As New ZipItemLocalHeader(file.Name)
                zip.WriteItemLocalHeader(zipItemLocalHeader1)

                readMeMessage &= String.Concat(vbTab, (count + 1).ToString & "- ", Path.GetFileName(file.FullName), Environment.NewLine)

                Using fs As FileStream = file.OpenRead()
                    'Write the current item's data to the zip archive
                    zip.WriteItemData(fs, buffer, 0, buffer.Length)
                End Using

                count += 1
            Next file

            itemHeader.FileName = "README.txt"
            zip.WriteItemLocalHeader(itemHeader)

            ' Add the README.txt file to the ZIP
            Dim data() As Byte = System.Text.Encoding.ASCII.GetBytes(readMeMessage)
            zip.WriteItemData(data)

            'Close the Zip archive. Writes the archive's central header.
            zip.CloseZipFile()
        End If

    End Using
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top