Example #1
0
 internal bool ExtractFileInternal(File f, FATX_Browser.FATX.IOWriter outIO, ref long sizeWritten, ref long maxVal)
 {
     //Create our binaryreader
     FATX_Browser.FATX.IOReader br;
     try
     {
         //Create our new misc class
         Misc m = new Misc();
         //Create our blocks occupied list to speed some things up if the
         //blocks haven't been loaded yet
         System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
         s.Start();
         List<uint> BlocksOccupied = f.BlocksOccupied.ToList<uint>();
         maxVal = BlocksOccupied.Count;
         if (BlocksOccupied.Count >= 1)
         {
             //Get our IO...
             br = xDrive.GetIO();
             //For each loop increase our sizewritten, and keep looping
             //until we've reached the block BEFORE the final (size may not
             //be 0x4000 bytes)
             for (int i = 0; i < BlocksOccupied.Count - 1; i++, sizeWritten++)
             {
                 //Get and set our reader position
                 long position = m.GetBlockOffset(BlocksOccupied.ToArray()[i], f.PartInfo);
                 br.BaseStream.Position = position;
                 //Write to our output file what we just read
                 outIO.Write(br.ReadBytes((int)f.PartInfo.ClusterSize));
                 br.BaseStream.Flush();
                 outIO.BaseStream.Flush();
             }
             //KAY, now we've reached the final block in the series
             br.BaseStream.Position = m.GetBlockOffset(BlocksOccupied.ToArray()[BlocksOccupied.Count - 1], f);
             //Right here, we read the remaining data, and write it all
             //in one swoop
             outIO.Write(m.ReadBytes(ref br, m.RemainingData(f)));
             br.BaseStream.Flush();
             outIO.BaseStream.Flush();
             //Close our IO's
             br.Close();
             outIO.Close();
             sizeWritten++;
             return true;
         }
         return false;
     }
     catch (Exception e) { outIO.Close(); throw e; }
 }