C# ZipArchive无效的Zip文件
我们的应用程序正在Docker中运行,每个进程的可用内存有限。我们处理和压缩大型文件,因此通常使用FileOptions.DeleteOnClose选项将FileStreams用作临时流 当我们创建zip文件时,我们创建一个临时文件流,使用ZipArchive写入流,处理ZipArchive,倒带流,并将流的内容复制到一些持久性存储,如Mongo GridFS。我们遇到的问题是,持久存储中的zip文件是无效的zip文件 为了隔离问题,我们创建了一个持久的“临时”文件流,并在处理ZipArchive和文件流后检查其有效性。我们看到的是,ZipArchive Dispose()之后的filestream是无效的zip文件,但filestream Dispose()之后的filestream是有效的流。释放filestream后,磁盘上的长度与释放前的长度不匹配。为什么在释放filestream之前,磁盘上的文件不是有效的zip文件C# ZipArchive无效的Zip文件,c#,zip,filestream,C#,Zip,Filestream,我们的应用程序正在Docker中运行,每个进程的可用内存有限。我们处理和压缩大型文件,因此通常使用FileOptions.DeleteOnClose选项将FileStreams用作临时流 当我们创建zip文件时,我们创建一个临时文件流,使用ZipArchive写入流,处理ZipArchive,倒带流,并将流的内容复制到一些持久性存储,如Mongo GridFS。我们遇到的问题是,持久存储中的zip文件是无效的zip文件 为了隔离问题,我们创建了一个持久的“临时”文件流,并在处理ZipArchiv
[Test]
public async Task ZipFile2()
{
string zipPath = Path.Combine(Path.GetTempPath(), "test.zip");
long streamLengthBeforeClose;
using (var sourceFile = new FileStream("../../../../Foundations.Blob.UnitTests/TestData/test-file.txt", FileMode.Open))
using (var zipStream = new FileStream(zipPath, FileMode.Create))
{
using var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, true);
{
var entry = archive.CreateEntry("test-file.txt");
using (var entryStream = entry.Open())
{
// copy from the blob to the zip entry
await sourceFile.CopyToAsync(entryStream, CancellationToken.None);
}
}
zipStream.Flush();
// at this point the zipStream IS NOT A VALID ZIP FILE
streamLengthBeforeClose = zipStream.Length;
}
// at this point the zipStream IS A VALID ZIP FILE
var fi = new FileInfo(zipPath);
// These do not match
Assert.AreEqual(streamLengthBeforeClose, fi.Length);
}
注意:我们不希望使用try/finally和delete包装的持久临时文件流。内存流也不是可行的解决方案。更改行实例化
存档
:
using var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, true);
致:
否则,您会混淆处理流,从而导致所描述的行为。更改行实例化
存档:
using var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, true);
致:
否则,你会把自己搞混,从而导致描述的行为。哇,有时候你只需要另一双眼睛。这个修好了,谢谢@bobcat1506很乐意帮忙。如果答案适合您,请将其标记为已接受(答案左侧的绿色勾选标记);)哇,有时候你只需要另一双眼睛。这个修好了,谢谢@bobcat1506很乐意帮忙。如果答案适合您,请将其标记为已接受(答案左侧的绿色勾选标记);)