public Archive(string fileName)
        {
            FileName = fileName;
            using (System.IO.FileStream stream = System.IO.File.Open(FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read))
            {
                CFHEADER header = CFHEADER.FromStream(stream);

                int dataBlocks = 0;

                for (int i = 0; i < header.CFHEADER_FIXED.cFolders; i++)
                {
                    CFFOLDER folder = CFFOLDER.FromStream(stream, header);
                    m_folders.Add(folder);

                    dataBlocks += folder.cCFData;
                }

                stream.Seek(header.CFHEADER_FIXED.coffFiles, System.IO.SeekOrigin.Begin);

                for (int i = 0; i < header.CFHEADER_FIXED.cFiles; i++)
                {
                    CFFILE file = CFFILE.FromStream(stream);
                    m_files.Add(file);
                }
                stream.Close();
            }
        }
        internal static CFDATA FromStream(FileStream stream, CFHEADER header)
        {
            CFDATA cfdata = new CFDATA();

            BinaryReader reader = new BinaryReader(stream);

            cfdata.csum      = reader.ReadUInt32();
            cfdata.cbData    = reader.ReadUInt16();
            cfdata.cbUncomp  = reader.ReadUInt16();
            cfdata.abReserve = reader.ReadBytes(header.CFHEADER_OPTIONAL.cbCFData);
            cfdata.ab        = reader.ReadBytes(cfdata.cbData);

            return(cfdata);
        }
        internal static CFFOLDER FromStream(FileStream stream, CFHEADER header)
        {
            CFFOLDER     folder = new CFFOLDER();
            BinaryReader reader = new BinaryReader(stream);

            folder.coffCabStart = reader.ReadUInt32();
            folder.cCFData      = reader.ReadUInt16();
            folder.typeCompress = reader.ReadUInt16();

            if (((header.CFHEADER_FIXED.flags & CFHEADER_FLAGS.RESERVE_PRESENT) == CFHEADER_FLAGS.RESERVE_PRESENT) &&
                header.CFHEADER_OPTIONAL.cbCFFolder != 0)
            {
                folder.abReserve = reader.ReadBytes(header.CFHEADER_OPTIONAL.cbCFFolder);
            }

            return(folder);
        }