首页 > 解决方案 > 在 c# 中以编程方式创建新条目后,什么会导致 zip 文件中的“丢失或损坏的标头”?

问题描述

我正在尝试创建一个 zip 文件,然后在 C# 中以编程方式添加 2 个新条目(xml 和 csv 文件)。但是我成功地编写了第一个条目,之后由于某种原因它使我的 zip 文件损坏(更准确地说,它导致标题丢失或损坏)。

因此,当它尝试打开已经存在的 zip 文件以写入第二个条目时,会引发异常。

抛出异常:

System.IO.Compression.FileSystem.dll 中的“System.IO.InvalidDataException”(“找不到中央目录记录的结尾。”)

    if (Path.GetExtension(fileName) == ".zip")
    {
        m_fsOutput = new FileStream(fileName, FileMode.Create);
        m_zipFile = new ZipArchive(m_fsOutput, ZipArchiveMode.Create, true);

        ZipArchiveEntry CSVentry = m_zipFile.CreateEntry(String.Format(CultureInfo.InvariantCulture, "Test{0}.csv", testCells.ElementAt(0).Test), CompressionLevel.Optimal);
        m_fsFileWriter = new StreamWriter(CSVentry.Open());
    }

这是我初始化 zip 文件和streamWriter第一个条目的地方。基本上m_fsFileWriter是一种类型,StreamWriter我用这个对象在其他地方写文件。

标签: c#zip

解决方案


几周前我只需要做类似的事情。我使用的代码是这样的:

List<FileStream> FilesList = new List<FileStream>();
//Add your files
using (var archive = new ZipArchive(outStream, ZipArchiveMode.Create, true))
{
    int i = 0;
    foreach (var FileStream in FilesList)
    {
        string fileName = "File"+i;
        var fileInArchive = archive.CreateEntry(fileName, CompressionLevel.Optimal);
        using (var entryStream = fileInArchive.Open())
        {

            entryStream.Flush();
            FileStream.CopyTo(entryStream);
            FileStream.Flush();

        }
        i++;
    }

}
var path = "your path";
using (var fileStream = new FileStream(path, FileMode.Create))
{
    outStream.Seek(0, SeekOrigin.Begin); 

    outStream.CopyTo(fileStream);
}

FilesList 是要添加到 zip 存档的文件的流。


推荐阅读