ZIP file created with SharpZipLib cannot be opened on Mac OS X

前端 未结 10 1309
有刺的猬
有刺的猬 2021-02-04 08:31

Argh, today is the day of stupid problems and me being an idiot.

I have an application which creates a zip file containing some JPEGs from a certain directory. I use th

10条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-02-04 09:23

    I agree with Cheeso's answer however if the Input file size is greater than 2GB then byte[] buffer = File.ReadAllBytes(pathname); will throw an IO exception. So i modified Cheeso code and it works like a charm for all the files.

    .

           long maxDataToBuffer = 104857600;//100MB 
           using (var outStream = new FileStream("Out3.zip", FileMode.Create))
           {
                using (var zipStream = new ZipOutputStream(outStream))
                {
                    Crc32 crc = new Crc32();
    
                    foreach (string pathname in pathnames)
                    {
                        tempBuffLength = maxDataToBuffer;
                        FileStream fs = System.IO.File.OpenRead(pathname);
    
                        ZipEntry entry = new ZipEntry(Path.GetFileName(pathname));
                        entry.DateTime = now;
                        entry.Size = buffer.Length;
    
                        crc.Reset();
    
                        long totalBuffLength = 0;
                        if (fs.Length <= tempBuffLength) tempBuffLength = fs.Length;
    
                        byte[] buffer = null;
                        while (totalBuffLength < fs.Length)
                        {
                            if ((fs.Length - totalBuffLength) <= tempBuffLength)
                                tempBuffLength = (fs.Length - totalBuffLength);
    
                            totalBuffLength += tempBuffLength;
                            buffer = new byte[tempBuffLength];
                            fs.Read(buffer, 0, buffer.Length);
                            crc.Update(buffer, 0, buffer.Length);
                            buffer = null;
                        }
    
                        entry.Crc = crc.Value;
                        zipStream.PutNextEntry(entry);
    
                        tempBuffLength = maxDataToBuffer;
                        fs = System.IO.File.OpenRead(pathname);
                        totalBuffLength = 0;
                        if (fs.Length <= tempBuffLength) tempBuffLength = fs.Length;
    
                        buffer = null;
                        while (totalBuffLength < fs.Length)
                        {
                            if ((fs.Length - totalBuffLength) <= tempBuffLength)
                                tempBuffLength = (fs.Length - totalBuffLength);
    
                            totalBuffLength += tempBuffLength;
                            buffer = new byte[tempBuffLength];
                            fs.Read(buffer, 0, buffer.Length);
                            zipStream.Write(buffer, 0, buffer.Length);
                            buffer = null;
                        }
                        fs.Close();
                    }
    
                    zipStream.Finish();
    
                    // I dont think this is required at all
                    zipStream.Flush();
                    zipStream.Close();
    
                }
            }
    

提交回复
热议问题