ZipArchive无效的Zip文件

bobcat1506

我们的应用程序在Docker中运行,每个进程中可用的内存有限。我们使用大型文件并对其进行压缩,因此习惯上将FileStreams与FileOptions.DeleteOnClose选项一起用作临时流。

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

为了找出问题,我们创建了一个持久的“临时”文件流,并在处理ZipArchive之后和在处理文件流之后检查其有效性。我们看到的是ZipArchive Dispose()之后的文件流是一个无效的zip文件,但是在Filestream Dispose()之后的文件流是一个有效的流。处置文件流后,磁盘上的长度不匹配处置前的长度。为什么在释放文件流之前,磁盘上的文件不是有效的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 / final和delete包裹的持久性临时文件流。内存流也不是可行的解决方案。

大师斯特隆

更改行实例化archive

using var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, true);

至:

using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, true))

否则,您将流处理混乱,导致描述的行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ZipArchive :: getStatusString():无效或未初始化的Zip对象

来自分类Dev

ZipArchive是否将整个zip文件加载到内存中

来自分类Dev

SSIS:捕获无效的Zip文件

来自分类Dev

生成的ZIP文件已损坏/无效

来自分类Dev

生成的ZIP文件已损坏/无效

来自分类Dev

ZipArchive :: addEmptyDir在.zip文件中创建一个空文件

来自分类Dev

ZipArchive :: addEmptyDir在.zip文件中创建一个空文件

来自分类Dev

PHP-在Linux上使用ZipArchive将文件添加到zip时出现编码错误

来自分类Dev

使用MemoryStream和ZipArchive在asp.net Web API中将zip文件返回给客户端

来自分类Dev

ZipArchive提取-单个文件

来自分类Dev

无法提取.zip文件。获取无效的数据异常

来自分类Dev

无法提取.zip文件。获取无效的数据异常

来自分类Dev

zip错误:无效的命令参数(无法将zip文件写入终端)

来自分类Dev

下载zip文件后出现“压缩(zip)文件夹无效或损坏”错误-有时但并非总是如此

来自分类Dev

在opencart中上传zip文件扩展名时出现无效的文件类型错误

来自分类Dev

使用php下载zip文件后,如何解决“无效文件”错误?

来自分类Dev

ZipArchive返回空文件C#

来自分类Dev

ZipArchive ::检查文件扩展名

来自分类Dev

在Java中解压缩会导致“ java.util.zip.ZipException”的zip文件-无效的LOC标头(错误的签名)

来自分类Dev

嵌入式ZIP压缩为EXE的ZipArchive

来自分类Dev

ZipArchive-未创建zip,但未引发任何错误

来自分类Dev

PHP7 中的 ZipArchive 找不到 zip 的内容

来自分类Dev

在Rails中,我可以检查上传的zip文件是否损坏或无效吗?

来自分类Dev

该捆绑包无效-文件扩展名必须为.zip

来自分类Dev

Eclipse:Java3D库无法读取或无效的zip文件

来自分类Dev

无效或统一的Zip对象

来自分类Dev

无效或单元化的Zip对象

来自分类Dev

zip 中的压缩数据无效

来自分类Dev

错误java.util.zip.ZipException:将图片(.png)从1个zip文件复制到另一个文件时,条目大小无效

Related 相关文章

  1. 1

    ZipArchive :: getStatusString():无效或未初始化的Zip对象

  2. 2

    ZipArchive是否将整个zip文件加载到内存中

  3. 3

    SSIS:捕获无效的Zip文件

  4. 4

    生成的ZIP文件已损坏/无效

  5. 5

    生成的ZIP文件已损坏/无效

  6. 6

    ZipArchive :: addEmptyDir在.zip文件中创建一个空文件

  7. 7

    ZipArchive :: addEmptyDir在.zip文件中创建一个空文件

  8. 8

    PHP-在Linux上使用ZipArchive将文件添加到zip时出现编码错误

  9. 9

    使用MemoryStream和ZipArchive在asp.net Web API中将zip文件返回给客户端

  10. 10

    ZipArchive提取-单个文件

  11. 11

    无法提取.zip文件。获取无效的数据异常

  12. 12

    无法提取.zip文件。获取无效的数据异常

  13. 13

    zip错误:无效的命令参数(无法将zip文件写入终端)

  14. 14

    下载zip文件后出现“压缩(zip)文件夹无效或损坏”错误-有时但并非总是如此

  15. 15

    在opencart中上传zip文件扩展名时出现无效的文件类型错误

  16. 16

    使用php下载zip文件后,如何解决“无效文件”错误?

  17. 17

    ZipArchive返回空文件C#

  18. 18

    ZipArchive ::检查文件扩展名

  19. 19

    在Java中解压缩会导致“ java.util.zip.ZipException”的zip文件-无效的LOC标头(错误的签名)

  20. 20

    嵌入式ZIP压缩为EXE的ZipArchive

  21. 21

    ZipArchive-未创建zip,但未引发任何错误

  22. 22

    PHP7 中的 ZipArchive 找不到 zip 的内容

  23. 23

    在Rails中,我可以检查上传的zip文件是否损坏或无效吗?

  24. 24

    该捆绑包无效-文件扩展名必须为.zip

  25. 25

    Eclipse:Java3D库无法读取或无效的zip文件

  26. 26

    无效或统一的Zip对象

  27. 27

    无效或单元化的Zip对象

  28. 28

    zip 中的压缩数据无效

  29. 29

    错误java.util.zip.ZipException:将图片(.png)从1个zip文件复制到另一个文件时,条目大小无效

热门标签

归档