如何使用SharpZipLib将ZipFile写入磁盘

问题描述

如何使用SharpZipLib将ZipFile写入磁盘?

  • 您是否需要打开输出流才能将ZipFile写入磁盘?
  • 有没有办法获取ZipFile字节并执行File.WriteallBytes()

注意:我的问题不是关于压缩。只需获取现有的ZipFile并将其写入磁盘。

另外,请注意,我已经阅读过文档,并且此用例不存在。

https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples

解决方法

是否需要打开输出流才能将ZipFile写入磁盘?

根据他们的Github示例,他们建议使用ZipOutputStream创建一个流对象以写入文件并写入要压缩的文件,您需要打开FileStream将对象写入库中。

这是可用于压缩文件的代码示例。

// Depending on the directory this could be very large and would require more attention
// in a commercial package.
string[] filenames = Directory.GetFiles("directory");

// 'using' statements guarantee the stream is closed properly which is a big source
// of problems otherwise.  Its exception safe as well which is great.
using (ZipOutputStream s = new ZipOutputStream(File.Create("outputfile")))
{

    s.SetLevel(9); // 0 - store only to 9 - means best compression

    byte[] buffer = new byte[4096];

    foreach (string file in filenames)
    {

        // Using GetFileName makes the result compatible with XP
        // as the resulting path is not absolute.
        var entry = new ZipEntry(Path.GetFileName(file));

        // Setup the entry data as required.

        // Crc and size are handled by the library for seakable streams
        // so no need to do them here.

        // Could also use the last write time or similar for the file.
        entry.DateTime = DateTime.Now;
        s.PutNextEntry(entry);

        using (FileStream fs = File.OpenRead(file)) 
        {

            // Using a fixed size buffer here makes no noticeable difference for output
            // but keeps a lid on memory usage.
            int sourceBytes;
            do
            {
            sourceBytes = fs.Read(buffer,buffer.Length);
            s.Write(buffer,sourceBytes);
            } while (sourceBytes > 0);
        }
    }

    // Finish/Close arent needed strictly as the using statement does this automatically

    // Finish is important to ensure trailing information for a Zip file is appended.  Without this
    // the created file would be invalid.
    s.Finish();

    // Close is important to wrap things up and unlock the file.
    s.Close();
}

有什么方法可以获取ZipFile字节并执行File.WriteAllBytes()吗?

如果您要问我们是否可以直接写文件的字节而不用打开FileStream来读取要在zip文件中写的文件,那么可以,您可以一次将所有字节写到源zip文件,但这是一种不好的方法,因为它将立即将所有字节读取到内存中,如果压缩的文件很大,这可能是灾难性的。无论如何,这是您的操作方法:

只需使用以下代码替换上面示例中的FileStream部分:

var bytes = File.ReadAllBytes(file);
s.Write(bytes,bytes.Length); // write all bytes from 0 to the length of the bytes

因此,更新后的源代码为:

string[] filenames = Directory.GetFiles("directory");

using (ZipOutputStream s = new ZipOutputStream(File.Create("outputfile")))
{

    s.SetLevel(9);

    byte[] buffer = new byte[4096];

    foreach (string file in filenames)
    {
        var entry = new ZipEntry(Path.GetFileName(file));

        entry.DateTime = DateTime.Now;
        s.PutNextEntry(entry);
        var bytes = File.ReadAllBytes(file);
        s.Write(bytes,bytes.Length);
    }
    s.Finish();
    s.Close();
}