无法找到C#ZipArchive"中央目录结尾记录"

时间:2017-08-07 07:48:48

标签: c# zip ziparchive

我创建了一个BizTalk Custom Pipeline Component,它将所有消息部分压缩成一个zip流。在一些失败后,我在一个单独的测试项目中创建了以下测试方法。

基本上我得到一个XML文件,其中包含一个文件名和一个UUID,用于调用存储过程并获取数据库条目的Base64编码内容。 base64内容似乎有效,因为在解码并将其保存到文件系统后,Windows资源管理器可以毫无问题地读取文件。

将archiveStream保存到文件系统后,当我尝试解压缩文件时,我从7Zip收到以下错误消息: "意外的数据结束"。如果我尝试用7Zip打开文件就没问题了。我甚至可以从7Zip资源管理器中打开文件。

如果我尝试使用以下代码从C#读取文件,则会收到错误消息: "无法找到中央目录结束记录。"

解压缩代码:

    private static void ReadDat() {

        var path = @"...\zip\0e00128b-0a6e-4b99-944d-68e9c20a51c2.zip";

        var stream = System.IO.File.OpenRead(path);
        // End of Central Directory record could not be found:
        var zipArchive = new ZipArchive(stream, ZipArchiveMode.Read, false);
        foreach(var zipEntry in zipArchive.Entries) {

            var stream = zipEntry.Open();
            Console.WriteLine(stream.Length);

        }

    }

邮政编码:

    private static void StreamUuidList() {

        var path = @"...\2017-08-05T132705.xml";
        var xdoc = XDocument.Load(System.IO.File.OpenRead(path));
        var files = xdoc.Root.Descendants().Where(d => d.Name.LocalName.Equals("NodeName"));

        using (var archiveStream = new MemoryStream())
        using (var archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true)) {

            foreach (var file in files) {

                var fileName = file.Elements().Where(e => e.Name.LocalName.Equals("FileName")).FirstOrDefault()?.Value ?? "";
                var streamUuid = file.Elements().Where(e => e.Name.LocalName.Equals("StreamUUID")).FirstOrDefault()?.Value ?? "";                    

                // validation here...

                // get base64 content and convert content
                var base64Content = GetStreamContent(streamUuid);
                var data = Convert.FromBase64String(base64Content);
                var dataStream = new MemoryStream(data);
                dataStream.Seek(0, SeekOrigin.Begin);

                // debug - save to file location
                using (var fileStream = new FileStream($@"...\files\{fileName}", FileMode.Create)) {

                    dataStream.CopyTo(fileStream);

                }
                dataStream.Seek(0, SeekOrigin.Begin);

                // create zip entry
                var zipFile = archive.CreateEntry(fileName, GetCompressionLevelFromString("Optimal"));
                using (var zipFileStream = zipFile.Open()) {

                    // copy data from mesage part stream into zip entry stream
                    dataStream.Seek(0, SeekOrigin.Begin);
                    dataStream.CopyTo(zipFileStream);

                }

                Console.WriteLine(fileName + ": " + streamUuid);

            }

            // debug - save to file location
            archiveStream.Seek(0, SeekOrigin.Begin);
            using (var fileStream = new FileStream($@"...\zip\{Guid.NewGuid()}.dat", FileMode.Create)) {

                archiveStream.CopyTo(fileStream);

            }
            // debug end

        }

    }

0 个答案:

没有答案