C# ZipArchive无效的Zip文件

C# ZipArchive无效的Zip文件,c#,zip,filestream,C#,Zip,Filestream,我们的应用程序正在Docker中运行,每个进程的可用内存有限。我们处理和压缩大型文件,因此通常使用FileOptions.DeleteOnClose选项将FileStreams用作临时流 当我们创建zip文件时,我们创建一个临时文件流,使用ZipArchive写入流,处理ZipArchive,倒带流,并将流的内容复制到一些持久性存储,如Mongo GridFS。我们遇到的问题是,持久存储中的zip文件是无效的zip文件 为了隔离问题,我们创建了一个持久的“临时”文件流,并在处理ZipArchiv

我们的应用程序正在Docker中运行,每个进程的可用内存有限。我们处理和压缩大型文件,因此通常使用FileOptions.DeleteOnClose选项将FileStreams用作临时流

当我们创建zip文件时,我们创建一个临时文件流,使用ZipArchive写入流,处理ZipArchive,倒带流,并将流的内容复制到一些持久性存储,如Mongo GridFS。我们遇到的问题是,持久存储中的zip文件是无效的zip文件

为了隔离问题,我们创建了一个持久的“临时”文件流,并在处理ZipArchive和文件流后检查其有效性。我们看到的是,ZipArchive Dispose()之后的filestream是无效的zip文件,但filestream Dispose()之后的filestream是有效的流。释放filestream后,磁盘上的长度与释放前的长度不匹配。为什么在释放filestream之前,磁盘上的文件不是有效的zip文件

    [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很乐意帮忙。如果答案适合您,请将其标记为已接受(答案左侧的绿色勾选标记);)