Что может вызвать «отсутствующий или поврежденный заголовок» в zip-файле после программного создания новой записи в c #? - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь создать zip-файл, а затем программно добавить 2 новые записи (xml и csv file) в C #. Но мне удалось написать первую запись, и после этого по какой-то причине это приводит к повреждению моего zip-файла (точнее, к отсутствующему или поврежденному заголовку).

Поэтому, когда он пытается открыть уже существующий zip-файл для записи второй записи, выдается исключение.

Исключение:

«System.IO.InvalidDataException» в System.IO.Compression.FileSystem.dll («Конец записи центрального каталога не найден.»)

    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, и я использую этот объект для записи файла в других местах.

1 Ответ

0 голосов
/ 11 июля 2019

Мне просто нужно было сделать нечто подобное несколько недель назад.Код, который я использовал, был таким:

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-архив.

...