diff --git a/OpenMcdf.Tests/StreamTests.cs b/OpenMcdf.Tests/StreamTests.cs index 0401e7c9..bddee3d4 100644 --- a/OpenMcdf.Tests/StreamTests.cs +++ b/OpenMcdf.Tests/StreamTests.cs @@ -326,6 +326,21 @@ public void WriteMultiple(Version version, int length) } } + [TestMethod] + [DataRow(Version.V3, 32)] + [DataRow(Version.V4, 256)] + public void CreateMultipleStreams(Version version, int streamCount) + { + using var rootStorage = RootStorage.CreateInMemory(version); + for (int i = 0; i < streamCount; i++) + { + Assert.AreEqual(i, rootStorage.EnumerateEntries().Count()); + + string streamName = $"TestStream{i}"; + using Stream stream = rootStorage.CreateStream(streamName); + } + } + [TestMethod] [DataRow(Version.V3, 0)] [DataRow(Version.V3, 63)] diff --git a/OpenMcdf/Fat.cs b/OpenMcdf/Fat.cs index 411c9c3f..8614159a 100644 --- a/OpenMcdf/Fat.cs +++ b/OpenMcdf/Fat.cs @@ -123,8 +123,6 @@ public uint Add(FatEnumerator fatEnumerator, uint startIndex) && fatEnumerator.MoveNextFreeEntry(); if (!movedToFreeEntry) { - Flush(); - uint newSectorId = fatSectorEnumerator.Add(); // Next id must be free @@ -133,8 +131,6 @@ public uint Add(FatEnumerator fatEnumerator, uint startIndex) ok = fatEnumerator.MoveNextFreeEntry(); Debug.Assert(ok); - - CacheCurrentSector(); } FatEntry entry = fatEnumerator.Current; diff --git a/OpenMcdf/FatChainEnumerator.cs b/OpenMcdf/FatChainEnumerator.cs index 2ca194d3..263d1160 100644 --- a/OpenMcdf/FatChainEnumerator.cs +++ b/OpenMcdf/FatChainEnumerator.cs @@ -131,10 +131,7 @@ public long GetLength() /// Extends the chain by one /// /// The ID of the new sector - public uint Extend() - { - return ExtendFrom(0); - } + public uint Extend() => ExtendFrom(0); /// /// Returns the ID of the first sector in the chain. @@ -177,13 +174,15 @@ public uint ExtendFrom(uint hintId) return startId; } + Reset(); + uint lastId = startId; while (MoveNext()) { lastId = current; } - uint id = fat.Add(fatEnumerator, lastId); + uint id = fat.Add(fatEnumerator, hintId); fat[lastId] = id; return id; }