How to tell how big zip file will be

2 posts, 0 answers
  1. Randy Hompesch
    Randy Hompesch avatar
    70 posts
    Member since:
    Nov 2008

    Posted 17 May Link to this post

    Hi,

    I have a situation where I need to send a fairly large amount of data via zip files by email.

    The company server limits emails to 4 mg in size, so I can't send one big zip file that, for example,  might be 10mg.

    I need to:

    1. create a zip file

    2. add a file to it

    3. test how big the zip file is.

    4. if it's larger than 4 mg, back out the file I just added use the< 4mg file to attach to the email.

    5. Lather, rinse, repeat until all files have been sent.

    How do I tell what the current size of the zip file will be after adding a file to it but before I close the archive?

     

    01.MailMessage mail;
    02.long currentZipSize = 0;
    03.int attIdx = 0;
    04.// Get the selected attachments
    05.var q = from a in db.Attachments
    06.    where rptParms.AttachmentIds.Contains(a.AttachmentId)
    07.    select a;
    08.List<Models.Attachment> lstSel = q.ToList();
    09.int i;
    10.mail = new MailMessage();
    11.using (MemoryStream ms = new MemoryStream())
    12.{
    13.using (ZipArchive zArchive = new ZipArchive(ms, ZipArchiveMode.Create, true))
    14.{
    15.    var lrEntry = zArchive.CreateEntry("LabReport.pdf", CompressionLevel.Fastest);
    16.    using (BinaryWriter bw = new BinaryWriter(lrEntry.Open()))
    17.    {
    18.        bw.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
    19.        bw.Flush();
    20.    }
    21.    currentZipSize = zArchive.GetSize; // ************* how do I get this size?
    22.    Models.Attachment att1;
    23. 
    24.    // Add them to teh zip
    25.    for(i = attIdx; i < lstSel.Count; i++)
    26.    {
    27.        att1 = lstSel[i];
    28.        ZipArchiveEntry zEntry = zArchive.CreateEntry(att1.FileName, CompressionLevel.Fastest);
    29.        using (var f = File.Open(att1.FullPathDecorated, FileMode.Open))
    30.        {
    31.            using (Stream entryStream = zEntry.Open())
    32.            {
    33.                f.CopyTo(entryStream);
    34.// ************* how do I get this size? when I run this I get an error
    35.// *************
    36.                currentZipSize += zEntry.CompressedLength;
    37.            }
    38.            // if the size is too big for the mail server back out the last file
    39.            if (currentZipSize > 4000000)
    40.            {
    41.                currentZipSize -= zEntry.CompressedLength;
    42.                zArchive.GetEntry(att1.FileName).Delete();
    43. 
    44.                ms.Seek(currentZipSize, SeekOrigin.Begin);
    45.                SendMail(mail, rptParms, ms, zArchive, af.CustomKey, emailCnt++);
    46.                currentZipSize = 0;
    47.                attIdx--;
    48.            }
    49.            else
    50.                attIdx++;
    51.        }
    52.    }
    53. 
    54. 
    55.}
    56.//byte[] buf = ms.GetBuffer();
    57.//Buffer.BlockCopy(buf, numberOfBytesToRemove, buf, 0, (int)ms.Length - numberOfBytesToRemove);
    58.//ms.SetLength(ms.Length - numberOfBytesToRemove);
    59.//ms.Seek(0, SeekOrigin.Begin);
    60.//System.Net.Mail.Attachment oAttach = new System.Net.Mail.Attachment(ms, "LabReport.zip");
    61.//mail.Attachments.Add(oAttach);
    62.//SmtpClient client = new SmtpClient();
    63.//client.Host = "intermail.basf-corp.com";
    64.//client.Send(mail);
    65.//client.Dispose();
    66.//mail.Dispose();
    67.Utilities.SetStatusBarText(EventAggregator, "Report Sent.");
    68.}

     

     

  2. Boby
    Admin
    Boby avatar
    636 posts

    Posted 22 May Link to this post

    Hello Randy,

    You can get the size of the entry only after the disposal of the entry, so the following should work:
    using (Stream stream = File.Open(@"d:\temp\test.zip", FileMode.Create))
    {
        using (ZipArchive archive = new ZipArchive(stream, ZipArchiveMode.Create, false, null))
        {
            ZipArchiveEntry entry = archive.CreateEntry("text.txt");
            try
            {
                StreamWriter writer = new StreamWriter(entry.Open());
                writer.WriteLine("Hello world!");
                writer.Flush();
            }
            finally
            {
                entry.Dispose();
     
                // Here, after the disposal, you can get the compressed size.
                var length = entry.CompressedLength;
            }
        }
    }


    Regards,
    Boby
    Telerik by Progress

Back to Top