Search code examples
asp.net.netcompressiondotnetzipxceed

Compressing a directory on the go using Xceed


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

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