Esempio n. 1
0
        /// <summary>
        /// Returns the directory information associated with a main directory entry at a given index.
        /// </summary>
        /// <param name="dirIndex">Index of the main directory entry.</param>
        /// <returns></returns>
        /// <exception cref="FileNotFoundException">Thrown if the file does not exist in the filesystem.</exception>
        internal DragonDosDirectoryItem GetDirectoryItem(int dirIndex)
        {
            ReadDirectoryTrack();

            var extents    = new List <DragonDosDirectoryEntry.Extent>();
            var direntries = new List <int>();
            var item       = new DragonDosDirectoryItem();

            var dirent = GetDirectoryEntry(dirIndex);

            item.Filename    = dirent.Filename;
            item.IsProtected = dirent.IsProtected;
            direntries.Add(dirIndex);
            foreach (var extent in dirent.Extents)
            {
                extents.Add(extent);
            }

            while (dirent.IsExtended)
            {
                dirIndex = dirent.NextEntry;
                dirent   = GetDirectoryEntry(dirIndex);
                direntries.Add(dirIndex);
                foreach (var extent in dirent.Extents)
                {
                    extents.Add(extent);
                }
            }

            item.Extents        = extents.ToArray();
            item.DirEntries     = direntries.ToArray();
            item.LastSectorSize = dirent.LastSectorSize;

            return(item);
        }
Esempio n. 2
0
        /// <summary>
        /// Returns the payload data for a given file.
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        internal byte[] GetFileData(DragonDosDirectoryItem item)
        {
            int size = item.Size;

            byte[] data   = new byte[size];
            int    offset = 0;

            foreach (var extent in item.Extents)
            {
                int lsn = extent.Lsn;
                int len = extent.Length;
                while (len-- > 0)
                {
                    var sector = ReadSector(lsn++);
                    Array.Copy(sector, 0, data, offset, Math.Min(size, SectorSize));
                    size   -= SectorSize;
                    offset += SectorSize;
                }
            }
            return(data);
        }
Esempio n. 3
0
 /// <summary>
 /// Returns the payload data for a given file.
 /// </summary>
 /// <param name="item"></param>
 /// <returns></returns>
 internal byte[] GetFileData(DragonDosDirectoryItem item)
 {
     int size = item.Size;
     byte[] data = new byte[size];
     int offset = 0;
     foreach (var extent in item.Extents)
     {
         int lsn = extent.Lsn;
         int len = extent.Length;
         while (len-- > 0)
         {
             var sector = ReadSector(lsn++);
             Array.Copy(sector, 0, data, offset, Math.Min(size, SectorSize));
             size -= SectorSize;
             offset += SectorSize;
         }
     }
     return data;
 }
Esempio n. 4
0
        /// <summary>
        /// Returns the directory information associated with a main directory entry at a given index.
        /// </summary>
        /// <param name="dirIndex">Index of the main directory entry.</param>
        /// <returns></returns>
        /// <exception cref="FileNotFoundException">Thrown if the file does not exist in the filesystem.</exception>
        internal DragonDosDirectoryItem GetDirectoryItem(int dirIndex)
        {
            ReadDirectoryTrack();

            var extents = new List<DragonDosDirectoryEntry.Extent>();
            var direntries = new List<int>();
            var item = new DragonDosDirectoryItem();

            var dirent = GetDirectoryEntry(dirIndex);
            item.Filename = dirent.Filename;
            item.IsProtected = dirent.IsProtected;
            direntries.Add(dirIndex);
            foreach (var extent in dirent.Extents)
            {
                extents.Add(extent);
            }

            while (dirent.IsExtended)
            {
                dirIndex = dirent.NextEntry;
                dirent = GetDirectoryEntry(dirIndex);
                direntries.Add(dirIndex);
                foreach (var extent in dirent.Extents)
                {
                    extents.Add(extent);
                }
            }

            item.Extents = extents.ToArray();
            item.DirEntries = direntries.ToArray();
            item.LastSectorSize = dirent.LastSectorSize;

            return item;
        }