From 9bdd16c33939f2dc72db5e66255682f61d8e5916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20N=C3=B8rfjand=20Stengaard?= Date: Mon, 16 Feb 2026 12:00:17 +0100 Subject: [PATCH] Fix fat load entries update end of entries when cluster doesnt contain end marker entry --- Library/DiscUtils.Fat/Directory.cs | 2 + Tests/LibraryTests/Fat/FatFileSystemTest.cs | 70 ++++++++++++++++++++- 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/Library/DiscUtils.Fat/Directory.cs b/Library/DiscUtils.Fat/Directory.cs index 5e7b2470..3de3d115 100644 --- a/Library/DiscUtils.Fat/Directory.cs +++ b/Library/DiscUtils.Fat/Directory.cs @@ -471,6 +471,8 @@ private void LoadEntries() { AddEntryRaw(streamPos, entry); } + + _endOfEntries = _dirStream.Position; } // Record any pending free entry diff --git a/Tests/LibraryTests/Fat/FatFileSystemTest.cs b/Tests/LibraryTests/Fat/FatFileSystemTest.cs index eb21c03c..34f93dab 100644 --- a/Tests/LibraryTests/Fat/FatFileSystemTest.cs +++ b/Tests/LibraryTests/Fat/FatFileSystemTest.cs @@ -608,4 +608,72 @@ public void CreateDirectoryWithExistingData() Assert.Empty(entries); } -} + + [Fact] + public void CreateFilesInSubdirectoryUsingFatFileSystemPerFile() + { + using var diskStream = new SparseMemoryStream(); + + diskStream.Position = 0; + using (var fsFormat = FatFileSystem.FormatFloppy(diskStream, FloppyDiskType.HighDensity, "FLOPPY_IMG ")) + { + fsFormat.CreateDirectory("dir"); + } + + for (var i = 0; i < 20; i++) + { + using (var fsCreate = new FatFileSystem(diskStream)) + { + using (var fileStream = fsCreate.OpenFile($"dir{Path.DirectorySeparatorChar}file{i}.txt", FileMode.Create)) + { + fileStream.Write(new byte[10]); + } + } + } + + using var fsAssert = new FatFileSystem(diskStream); + { + var entries = fsAssert.GetFileSystemEntries("").ToList(); + Assert.Single(entries); + Assert.Equal("dir", entries[0]); + + entries = fsAssert.GetFileSystemEntries("dir").ToList(); + Assert.Equal(20, entries.Count); + Assert.Equal(Enumerable.Range(0, 20).Select(i => $"dir\\file{i}.txt"), entries); + } + } + + [Fact] + public void CreateFilesInSubdirectoryUsingOneFatFileSystem() + { + using var diskStream = new SparseMemoryStream(); + + diskStream.Position = 0; + using (var fsFormat = FatFileSystem.FormatFloppy(diskStream, FloppyDiskType.HighDensity, "FLOPPY_IMG ")) + { + fsFormat.CreateDirectory("dir"); + } + + using (var fsCreate = new FatFileSystem(diskStream)) + { + for (var i = 0; i < 20; i++) + { + using (var fileStream = fsCreate.OpenFile($"dir{Path.DirectorySeparatorChar}file{i}.txt", FileMode.Create)) + { + fileStream.Write(new byte[10]); + } + } + } + + using var fsAssert = new FatFileSystem(diskStream); + { + var entries = fsAssert.GetFileSystemEntries("").ToList(); + Assert.Single(entries); + Assert.Equal("dir", entries[0]); + + entries = fsAssert.GetFileSystemEntries("dir").ToList(); + Assert.Equal(20, entries.Count); + Assert.Equal(Enumerable.Range(0, 20).Select(i => $"dir\\file{i}.txt"), entries); + } + } +} \ No newline at end of file