private void WriteFile()
{
//if we are in create mode, we always set readEntries to true in Init
//if we are in update mode, we call EnsureCentralDirectoryRead, which sets readEntries to true
Debug.Assert(_readEntries);
if (_mode == ZipArchiveMode.Update)
{
List<ZipArchiveEntry> markedForDelete = new List<ZipArchiveEntry>();
foreach (ZipArchiveEntry entry in _entries)
{
if (!entry.LoadLocalHeaderExtraFieldAndCompressedBytesIfNeeded())
markedForDelete.Add(entry);
}
foreach (ZipArchiveEntry entry in markedForDelete)
entry.Delete();
_archiveStream.Seek(0, SeekOrigin.Begin);
_archiveStream.SetLength(0);
}
foreach (ZipArchiveEntry entry in _entries)
{
entry.WriteAndFinishLocalEntry();
}
long startOfCentralDirectory = _archiveStream.Position;
foreach (ZipArchiveEntry entry in _entries)
{
entry.WriteCentralDirectoryFileHeader();
}
long sizeOfCentralDirectory = _archiveStream.Position - startOfCentralDirectory;
WriteArchiveEpilogue(startOfCentralDirectory, sizeOfCentralDirectory);
}