是否必须打开输出流才能将 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, 0, buffer.Length);
s.Write(buffer, 0, 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, 0, 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, 0, bytes.Length);
}
s.Finish();
s.Close();
}