/// <summary> 使用外部的的<see cref="WzFileStream"/>儲存資料 </summary> public bool Write(WzFileStream zs) { this.Hash = HashTools.GenerateArchiveVersionHash(this.Version.ToString()); // header zs.Write(new byte[] { (byte)'P', (byte)'K', (byte)'G', (byte)'1' }, 4); zs.Write8(0); //Reserve zs.Write4u(0); //Reserve zs.WriteString(this.Description); // data long off = zs.Tell(); this.DataOffset = (uint)off; zs.BaseOffset = this.DataOffset; zs.Write2u((ushort)HashTools.EncryptArchiveVersionHash(this.Hash)); this.RootDirectory.Update(); this.RootDirectory.Write(zs); long endoff = zs.Tell(); // rewrite size, offset zs.Seek(4); zs.Write8(endoff - off); zs.Write4u((uint)off); // end write zs.Flush(); return(true); }
/// <summary> </summary> internal override void Write(WzFileStream fs) { fs.Write4u(0); // Size Reserve long startBlock = fs.Tell(); fs.StringPool.Write(this.Value.ClassName, 0x73, 0x1B); this.Value.Write(fs); long endBlock = fs.Tell(); fs.Seek(startBlock - 4); fs.Write4u((uint)(endBlock - startBlock)); fs.Seek(endBlock); }
internal override void Write(WzFileStream zf) { // start write int count = this.Items.Count; long[] itemoff = new long[count]; this.Offset = (uint)zf.Tell(); zf.Write4(count, true); // write header for (int i = 0; i < count; i++) { WzArchiveItem item = this.Items[i]; zf.StringPool.DirectoryWrite(item.Name, item.Type, WzArchiveItemType.Reference); zf.Write4(item.Size, true); zf.Write4(item.Checksum, true); itemoff[i] = zf.Tell(); zf.Write4u(0u); // reserve } // package items for (int i = 0; i < count; i++) { this.Items[i].Write(zf); } long endoff = zf.Tell(); // rewrite offset for (int i = 0; i < count; i++) { zf.Seek(itemoff[i]); uint offKey = HashTools.GenerateOffsetKey((uint)zf.Tell(), this.Archive.DataOffset, this.Archive.Hash); uint encoff = HashTools.EncryptOffsetHash(this.Items[i].Offset, offKey, this.Archive.DataOffset); zf.Write4u(encoff); } // end write zf.Seek(endoff); }