public FatDirectoryEntry CreateSub(Fat fat) { var chain = new ClusterChain(fat, false); chain.SetChainLength(1); var entry = FatDirectoryEntry.Create(true); entry.SetStartCluster(chain.GetStartCluster()); var dir = new ClusterChainDirectory(chain, false); /* add "." entry */ var dot = FatDirectoryEntry.Create(true); dot.SetShortName(ShortName.Dot); dot.SetStartCluster(dir.GetStorageCluster()); CopyDateTimeFields(entry, dot); dir.AddEntry(dot); /* add ".." entry */ var dotDot = FatDirectoryEntry.Create(true); dotDot.SetShortName(ShortName.DotDot); dotDot.SetStartCluster(GetStorageCluster()); CopyDateTimeFields(entry, dotDot); dir.AddEntry(dotDot); dir.Flush(); return(entry); }
/// <summary> /// According to the FAT file system specification, leading and trailing /// spaces in the name are ignored by this method. /// </summary> /// <param name="name"></param> /// <returns></returns> /// <exception cref="IOException"></exception> public IFsDirectoryEntry AddDirectory(string name) { CheckWritable(); CheckUniqueName(name); name = name.Trim(); var sn = MakeShortName(name, true); var real = Dir.CreateSub(fat); real.SetShortName(sn); var e = new FatLfnDirectoryEntry(this, real, name); try { Dir.AddEntries(e.CompactForm()); } catch (IOException ex) { var cc = new ClusterChain(fat, real.GetStartCluster(), false); cc.SetChainLength(0); Dir.RemoveEntry(real); throw ex; } shortNameIndex.Add(sn, e); longNameIndex.Add(name.ToLowerInvariant(), e); GetDirectory(real); Flush(); return(e); }
/// <summary> /// Remove the entry with the given name from this directory. /// </summary> /// <param name="name">the name of the entry to remove</param> /// <exception cref="IOException">IOException on error removing the entry</exception> /// <exception cref="InvalidOperationException">InvalidOperationException on an attempt to remove the dot entries</exception> public void Remove(string name) { CheckWritable(); if (!(GetEntry(name) is FatLfnDirectoryEntry entry)) { return; } UnlinkEntry(entry); var cc = new ClusterChain( fat, entry.RealEntry.GetStartCluster(), false); cc.SetChainLength(0); FreeUniqueName(name); UpdateLfn(); }
public static ClusterChainDirectory CreateRoot(Fat fat) { if (fat.GetFatType() != FatType.BaseFat32) { throw new ArgumentException( "only FAT32 stores root directory in a cluster chain"); } var bs = (Fat32BootSector)fat.GetBootSector(); var cc = new ClusterChain(fat, false); cc.SetChainLength(1); bs.SetRootDirFirstCluster(cc.GetStartCluster()); var result = new ClusterChainDirectory(cc, true); result.Flush(); return(result); }
public void Delete() { Chain.SetChainLength(0); }