public override void EraseDirectoryStructures(VolumeInfo info, FileSystemEntriesEraseProgress callback) { using (FileStream stream = info.Open(FileAccess.ReadWrite, FileShare.ReadWrite)) { int directoriesCleaned = 0; FatApi api = GetFatApi(info, stream); HashSet<uint> eraseQueueClusters = new HashSet<uint>(); List<FatDirectoryEntry> eraseQueue = new List<FatDirectoryEntry>(); { FatDirectoryEntry entry = api.LoadDirectory(string.Empty); eraseQueue.Add(entry); eraseQueueClusters.Add(entry.Cluster); } using (VolumeLock volumeLock = info.LockVolume(stream)) { while (eraseQueue.Count != 0) { if (callback != null) callback(directoriesCleaned, directoriesCleaned + eraseQueue.Count); FatDirectoryBase currentDir = api.LoadDirectory(eraseQueue[0].FullName); eraseQueue.RemoveAt(0); foreach (KeyValuePair<string, FatDirectoryEntry> entry in currentDir.Items) if (entry.Value.EntryType == FatDirectoryEntryType.Directory) { if (eraseQueueClusters.Contains(entry.Value.Cluster)) continue; eraseQueueClusters.Add(entry.Value.Cluster); eraseQueue.Add(entry.Value); } currentDir.ClearDeletedEntries(); ++directoriesCleaned; } } } }