问题描述
如何使用SharpZipLib将ZipFile
写入磁盘?
注意:我的问题不是关于压缩。只需获取现有的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();
}