/// <summary>
        /// Creates a new archive based on the specified stream.
        /// </summary>
        public Archive(Stream stream)
        {
            if (!stream.CanRead)
            {
                throw new IOException("Archive stream must be readable.");
            }
            if (!stream.CanSeek)
            {
                throw new IOException("Archive stream must be seekable.");
            }
            this.stream = stream;

            br = new BinaryReader(stream);
            bw = new BinaryWriter(stream);

            if (stream.Length == 0)
            {
                bw.Write(Encoding.ASCII.GetBytes("Archive:"));
                Reserve();
                stream.Position = 8;
                bw.Write((short)5);
                bw.Write(0);
                bw.Write(-1);
                bw.Write("");
                bw.Flush();
            }
            stream.Position = 0;
            if (Encoding.ASCII.GetString(br.ReadBytes(8)) != "Archive:")
            {
                throw new Exception("Stream is not a valid archive.");
            }

            entries.Add(new FileInfo(this, "", 0, 1));
            AStream      a  = new AStream((FileInfo)entries[0]);
            BinaryReader ar = new BinaryReader(a);

            next_dir = ar.ReadInt32();
            string s;

            while ((s = ar.ReadString()) != "")
            {
                int i = ar.ReadInt32(), j = ar.ReadInt32();
                if (i < 0)
                {
                    entries.Add(new DirInfo(this, s, i, j));
                }
                else
                {
                    entries.Add(new FileInfo(this, s, i, j));
                }
            }
            a.Close();
        }
        internal void UpdateDirs()
        {
            AStream      a  = new AStream((FileInfo)entries[0], FileAccess.ReadWrite);
            BinaryWriter aw = new BinaryWriter(a);

            aw.Write(next_dir);
            foreach (DirInfo di in entries)
            {
                if (di.Name == "")
                {
                    continue;
                }
                aw.Write(di.Name);
                aw.Write(di.Index);
                aw.Write(di.Parent);
            }
            aw.Write("");
            a.SetLength(a.Position);
            a.Close();
        }