private void PopulateNewChildDirectory(DirectoryEntry newEntry) { // Populate new directory with initial (special) entries. First one is easy, just change the name! using (ClusterStream stream = new ClusterStream(_fileSystem, FileAccess.Write, newEntry.FirstCluster, uint.MaxValue)) { // First is the self-referencing entry... DirectoryEntry selfEntry = new DirectoryEntry(newEntry); selfEntry.Name = FileName.SelfEntryName; selfEntry.WriteTo(stream); // Second is a clone of our self entry (i.e. parent) - though dates are odd... DirectoryEntry parentEntry = new DirectoryEntry(SelfEntry); parentEntry.Name = FileName.ParentEntryName; parentEntry.CreationTime = newEntry.CreationTime; parentEntry.LastWriteTime = newEntry.LastWriteTime; parentEntry.WriteTo(stream); } }
internal void DeleteEntry(long id, bool releaseContents) { if (id < 0) { throw new IOException("Attempt to delete unknown directory entry"); } try { DirectoryEntry entry = _entries[id]; DirectoryEntry copy = new DirectoryEntry(entry); copy.Name = entry.Name.Deleted(); _dirStream.Position = id; copy.WriteTo(_dirStream); if (releaseContents) { _fileSystem.Fat.FreeChain(entry.FirstCluster); } _entries.Remove(id); _freeEntries.Add(id); HandleAccessed(true); } finally { _fileSystem.Fat.Flush(); } }
internal void UpdateEntry(long id, DirectoryEntry entry) { if (id < 0) { throw new IOException("Attempt to update unknown directory entry"); } _dirStream.Position = id; entry.WriteTo(_dirStream); _entries[id] = entry; }
internal long AddEntry(DirectoryEntry newEntry) { // Unlink an entry from the free list (or add to the end of the existing directory) long pos; if (_freeEntries.Count > 0) { pos = _freeEntries[0]; _freeEntries.RemoveAt(0); } else { pos = _endOfEntries; _endOfEntries += 32; } // Put the new entry into it's slot _dirStream.Position = pos; newEntry.WriteTo(_dirStream); // Update internal structures to reflect new entry (as if read from disk) _entries.Add(pos, newEntry); HandleAccessed(true); return pos; }