internal ExFatFilesystemEntry(DataDescriptor parentDataDescriptor, ExFatMetaDirectoryEntry metaEntry = null, DataDescriptor dataDescriptorOverride = null, ExFatFileAttributes?attributesOverride = null) { _dataDescriptorOverride = dataDescriptorOverride; ParentDataDescriptor = parentDataDescriptor; MetaEntry = metaEntry; _attributesOverride = attributesOverride; }
/// <summary> /// Adds the entry to directory (given by <see cref="DataDescriptor" />). /// </summary> /// <param name="dataDescriptor">The data descriptor.</param> /// <param name="metaEntry">The meta entry.</param> /// <returns>A <see cref="DataDescriptor"/> describing directory after append</returns> public void UpdateEntry(DataDescriptor dataDescriptor, ExFatMetaDirectoryEntry metaEntry) { lock (_directoryLock) { using (var directoryStream = OpenDataStream(dataDescriptor, FileAccess.ReadWrite)) { directoryStream.Seek(metaEntry.Primary.DirectoryPosition, SeekOrigin.Begin); metaEntry.Write(directoryStream); } } }
/// <summary> /// Adds the entry to directory (given by <see cref="DataDescriptor" />. /// </summary> /// <param name="targetDirectoryDataDescriptor">The data descriptor.</param> /// <param name="metaEntry">The meta entry.</param> /// <returns>A <see cref="DataDescriptor"/> describing directory after append</returns> public DataDescriptor AddEntry(DataDescriptor targetDirectoryDataDescriptor, ExFatMetaDirectoryEntry metaEntry) { var r = targetDirectoryDataDescriptor; lock (_directoryLock) { using (var directoryStream = OpenDataStream(targetDirectoryDataDescriptor, FileAccess.ReadWrite, d => r = d)) { var availableSlot = FindAvailableSlot(directoryStream, metaEntry.Entries.Count); directoryStream.Seek(availableSlot, SeekOrigin.Begin); foreach (var entry in metaEntry.Entries) { entry.EntryType.Value |= ExFatDirectoryEntryType.InUse; } metaEntry.Write(directoryStream); } } return(r); }
/// <summary> /// Creates a <see cref="ExFatFilesystemEntry" />. /// </summary> /// <param name="parent">The parent.</param> /// <param name="name">The name.</param> /// <param name="attributes">The attributes.</param> /// <returns></returns> private ExFatFilesystemEntry CreateEntry(ExFatFilesystemEntry parent, string name, FileAttributes attributes) { var now = DateTimeOffset.Now; var entries = new List <ExFatDirectoryEntry> { new FileExFatDirectoryEntry(new Buffer(new byte[32])) { EntryType = { Value = ExFatDirectoryEntryType.File }, FileAttributes = { Value = (ExFatFileAttributes)attributes }, CreationDateTimeOffset = { Value = now }, LastWriteDateTimeOffset = { Value = now }, LastAccessDateTimeOffset = { Value = now }, }, new StreamExtensionExFatDirectoryEntry(new Buffer(new byte[32])) { FirstCluster = { Value = 0 }, EntryType = { Value = ExFatDirectoryEntryType.Stream }, GeneralSecondaryFlags = { Value = ExFatGeneralSecondaryFlags.ClusterAllocationPossible }, NameLength = { Value = (byte)name.Length }, NameHash = { Value = _partition.ComputeNameHash(name) }, } }; for (int nameIndex = 0; nameIndex < name.Length; nameIndex += 15) { var namePart = name.Substring(nameIndex, Math.Min(15, name.Length - nameIndex)); entries.Add(new FileNameExtensionExFatDirectoryEntry(new Buffer(new byte[32])) { EntryType = { Value = ExFatDirectoryEntryType.FileName }, FileName = { Value = namePart } }); } var metaEntry = new ExFatMetaDirectoryEntry(entries); var entry = new ExFatFilesystemEntry(parent.DataDescriptor, metaEntry); return(entry); }