Ejemplo n.º 1
0
        /// <summary>
        /// Closes and finalizes JCR6 file so it's ready for usage.
        /// All Streams attacked to this JCR6 creation instance will automatically be closed and added according to their settings respectively.
        /// </summary>
        public void Close()
        {
            if (closed)
            {
                return;
            }
            CloseAllEntries();
            var whereami = mystream.Position;

            mystream.Position = ftoffint;
            mystream.WriteInt((int)whereami);
            mystream.Position = whereami;
            // TODO: finalizing JCR6 file
            var ms = new MemoryStream();
            var bt = new QuickStream(ms);

            foreach (string k in Comments.Keys)
            {
                bt.WriteByte(1);
                bt.WriteString("COMMENT");
                bt.WriteString(k);
                bt.WriteString(Comments[k]);
            }
            foreach (string k in Entries.Keys)
            {
                bt.WriteByte(1);
                bt.WriteString("FILE");
                var E = Entries[k];
                foreach (string k2 in E.datastring.Keys)
                {
                    bt.WriteByte(1); bt.WriteString(k2); bt.WriteString(E.datastring[k2]);
                }
                foreach (string k2 in E.databool.Keys)
                {
                    bt.WriteByte(2); bt.WriteString(k2); bt.WriteBool(E.databool[k2]);
                }
                foreach (string k2 in E.dataint.Keys)
                {
                    bt.WriteByte(3); bt.WriteString(k2); bt.WriteInt(E.dataint[k2]);
                }
                bt.WriteByte(255);
            }
            bt.WriteByte(255);
            // TODO: "BRUTE" support file table storage
            //Console.WriteLine($"Write on {whereami}/{mystream.Position}");
            var unpacked = ms.ToArray();
            var fts      = FileTableStorage;
            var packed   = JCR6.CompDrivers[FileTableStorage].Compress(unpacked);

            if (fts != "Store" || packed.Length >= unpacked.Length)
            {
                packed = unpacked; fts = "Store";
            }
            bt.Close();
            mystream.WriteInt(unpacked.Length);
            mystream.WriteInt(packed.Length);
            mystream.WriteString(fts);
            mystream.WriteBytes(packed);
            mystream.Close();
            closed = true;
        }
Ejemplo n.º 2
0
 public void WriteBytes(byte[] b, bool ce = false) => stream.WriteBytes(b, ce);