我试图创建一个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
的一种,我使用此对象在其他位置写入文件。
答案 0 :(得分:0)
几周前,我不得不做类似的事情。 我使用的代码是这样的:
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存档中的文件流。