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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        /// <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();
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 public void Delete()
 {
     Chain.SetChainLength(0);
 }