/// <summary> /// serializes a directory item entry. /// </summary> /// <param name="item">the item to be serialized.</param> /// <param name="dataWriter">the stream the item should be serialized to.</param> private static void SerializeItem(VirtualItem item, DataWriter dataWriter) { dataWriter.WriteUInt32(item.FileNumber); dataWriter.WriteByte((byte) (item is VirtualDirectory ? ItemType.Directory : ItemType.File)); dataWriter.WriteString(item.Name); }
/// <summary> /// removes an item entry from this directory. /// </summary> /// <param name="itemToRemove">the item to remove.</param> internal void RemoveItem(VirtualItem itemToRemove) { IEnumerable<VirtualItem> items = ReadAllItems(); var dataWriter = new DataWriter(); foreach (VirtualItem remainingItem in items.Where(item => item.FileNumber != itemToRemove.FileNumber)) { SerializeItem(remainingItem, dataWriter); } FileStream stream = GetFileStream(); byte[] data = dataWriter.GetData(); stream.Write(BitConverter.GetBytes((ulong) data.Length)); stream.Write(data); }
internal void RenameItem(VirtualItem virtualItem, string newName) { var dataWriter = new DataWriter(); foreach (VirtualItem item in ReadAllItems()) { if (item.FileNumber == virtualItem.FileNumber) { item.Name = newName; } SerializeItem(item, dataWriter); } FileStream stream = GetFileStream(); byte[] data = dataWriter.GetData(); if (stream.Length < data.Length + 8) { ContainerFile.ChangeFileSize(FileNumber, (uint) (data.Length + 8)); } stream = GetFileStream(); stream.Write(BitConverter.GetBytes((ulong) data.Length)); stream.Write(data); }
/// <summary> /// adds an item to this directory. /// </summary> /// <param name="itemToAdd">the item to add.</param> internal void AddItem(VirtualItem itemToAdd) { FileStream fileStream = GetFileStream(); long currentSize = BitConverter.ToInt64(fileStream.Read(8), 0); var dataWriter = new DataWriter(); SerializeItem(itemToAdd, dataWriter); byte[] data = dataWriter.GetData(); long newSize = currentSize + data.Length; if (fileStream.Length < newSize + 8) { ContainerFile.ChangeFileSize(FileNumber, (uint) (newSize + 8)); } fileStream = GetFileStream(); fileStream.Write(BitConverter.GetBytes(newSize)); fileStream.Seek(currentSize + 8, SeekOrigin.Begin); fileStream.Write(data); }