public void WriteFile(string filename, int[] stringReferences, int[] idReferences, ResourceInfo[] rawReferences) { if (!Directory.Exists(filename)) Directory.CreateDirectory(filename); FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); using (file) { BinaryWriter binWriter = new BinaryWriter(file); BinaryReader binReader = new BinaryReader(map.BaseStream); Tag.Info fileHeader = new Tag.Info(); file.Position = Tag.Info.Size; fileHeader.type = this.type; fileHeader.metaLength = metaLength; fileHeader.metaOffset = (int)file.Position; binWriter.Write(bufferStream.GetBuffer(), 0, fileHeader.metaLength); if (rawReferences.Length > 0) { binWriter.Write(Padding.GetBytes(file.Position, 512)); fileHeader.rawOffset = (int)file.Position; fileHeader.rawLength = (int)file.Position; for (int i = 0; i < rawReferences.Length; i++) { map.BaseStream.Position = rawReferences[i].Address; binWriter.Write(binReader.ReadBytes(rawReferences[i].Length & 0x7FFFFFFF)); binWriter.Write(Padding.GetBytes(file.Position, 512)); } fileHeader.rawLength = (int)file.Position - fileHeader.rawLength; binReader = new BinaryReader(bufferStream); binWriter.Write(Padding.GetBytes(file.Position, 512)); fileHeader.rawReferencesCount = rawReferences.Length; fileHeader.rawReferencesOffset = (int)file.Position; rawAddress = 0; for (int i = 0; i < rawReferences.Length; i++) { binWriter.Write(rawAddress); binWriter.Write(rawReferences[i].Length); rawAddress += rawReferences[i].Length & 0x7FFFFFFF; rawAddress += Padding.GetCount(rawAddress, 512); } } if (stringReferences.Length > 0) { binWriter.Write(Padding.GetBytes(file.Position, 512)); fileHeader.stringReferencesOffset = (int)file.Position; fileHeader.stringReferencesCount = stringReferences.Length; for (int i = 0; i < stringReferences.Length; i++) { string str = map.StringIdNames[stringReferences[i] & 0x0000FFFF]; binWriter.Write(Encoding.UTF8.GetBytes(str)); binWriter.Write(byte.MinValue); } if (stringReferences.Length > 1) file.Position -= 1; fileHeader.stringReferencesLength = (int)file.Position - fileHeader.stringReferencesOffset; } if (idReferences.Length > 0) { binWriter.Write(Padding.GetBytes(file.Position, 512)); fileHeader.idReferencesOffset = (int)file.Position; fileHeader.idReferencesCount = idReferences.Length; for (int i = 0; i < idReferences.Length; i++) { string type = map.Index.TagEntries[idReferences[i] & 0x0000FFFF].Type.ToString(); type = Index.GetCleanType(type).Trim(); string tagname = map.Tagnames[idReferences[i] & 0x0000FFFF]; binWriter.Write(Encoding.UTF8.GetBytes(Path.ChangeExtension(tagname, type))); binWriter.Write(byte.MinValue); } file.Position -= 1; fileHeader.idReferencesLength = (int)file.Position - fileHeader.idReferencesOffset; } binWriter.Write(Padding.GetBytes(file.Position, 512)); file.Position = 0; binWriter.Write(fileHeader.ToByteArray()); binWriter.Flush(); } }
public void BufferedWriteFile(string filename, int[] stringReferences, int[] idReferences, ResourceInfo[] rawReferences) { MemoryStream stream = new MemoryStream(); BinaryWriter memWriter = new BinaryWriter(stream); BinaryReader binReader = new BinaryReader(map.BaseStream); Tag.Info fileHeader = new Tag.Info(); stream.Position = Tag.Info.Size; fileHeader.type = this.type; fileHeader.cacheInformationOffset = (int)stream.Position; memWriter.Write(false); memWriter.Write(Padding.GetBytes(stream.Position, 4)); memWriter.Write(rawCache.Count); for (int i = 0; i < rawCache.Count; i++) memWriter.Write(rawCache.Values[i].Offset0); int sidCount = 0, tidCount = 0; for (int i = 0; i < valueCache.Count; i++) switch (valueCache.Values[i].Type) { case Value.ValueType.StringId: sidCount++; break; case Value.ValueType.TagId: tidCount++; break; case Value.ValueType.TagReference: tidCount++; break; } memWriter.Write(sidCount); for (int i = 0; i < valueCache.Count; i++) if (valueCache.Values[i].Type == Value.ValueType.StringId) memWriter.Write(valueCache.Values[i].Offset); memWriter.Write(tidCount); for (int i = 0; i < valueCache.Count; i++) if (valueCache.Values[i].Type == Value.ValueType.TagId || valueCache.Values[i].Type == Value.ValueType.TagReference) memWriter.Write(valueCache.Values[i].Offset); memWriter.Write(Padding.GetBytes(stream.Position, 512)); fileHeader.metaLength = metaLength; fileHeader.metaOffset = (int)stream.Position; memWriter.Write(bufferStream.GetBuffer(), 0, fileHeader.metaLength); if (rawReferences.Length > 0) { memWriter.Write(Padding.GetBytes(stream.Position, 512)); fileHeader.rawOffset = (int)stream.Position; fileHeader.rawLength = (int)stream.Position; for (int i = 0; i < rawReferences.Length; i++) { map.BaseStream.Position = rawReferences[i].Address; memWriter.Write(binReader.ReadBytes(rawReferences[i].Length & 0x7FFFFFFF)); memWriter.Write(Padding.GetBytes(stream.Position, 512)); } fileHeader.rawLength = (int)stream.Position - fileHeader.rawLength; binReader = new BinaryReader(bufferStream); memWriter.Write(Padding.GetBytes(stream.Position, 512)); fileHeader.rawReferencesCount = rawReferences.Length; fileHeader.rawReferencesOffset = (int)stream.Position; rawAddress = 0; for (int i = 0; i < rawReferences.Length; i++) { memWriter.Write(rawAddress); memWriter.Write(rawReferences[i].Length); rawAddress += rawReferences[i].Length & 0x7FFFFFFF; rawAddress += Padding.GetCount(rawAddress, 512); } } if (stringReferences.Length > 0) { memWriter.Write(Padding.GetBytes(stream.Position, 512)); fileHeader.stringReferencesOffset = (int)stream.Position; fileHeader.stringReferencesCount = stringReferences.Length; for (int i = 0; i < stringReferences.Length; i++) { string str = map.StringIdNames[stringReferences[i] & 0x0000FFFF]; memWriter.Write(Encoding.UTF8.GetBytes(str)); memWriter.Write(byte.MinValue); } if (stringReferences.Length > 1) stream.Position -= 1; fileHeader.stringReferencesLength = (int)stream.Position - fileHeader.stringReferencesOffset; } if (idReferences.Length > 0) { memWriter.Write(Padding.GetBytes(stream.Position, 512)); fileHeader.idReferencesOffset = (int)stream.Position; fileHeader.idReferencesCount = idReferences.Length; for (int i = 0; i < idReferences.Length; i++) { string type = map.Index.TagEntries[idReferences[i] & 0x0000FFFF].Type.ToString(); type = Index.GetCleanType(type).Trim(); string tagname = map.Tagnames[idReferences[i] & 0x0000FFFF]; string filepath = Path.ChangeExtension(tagname, type) + Tag.Path.Extension; filepath = Path.Combine(Directory.GetCurrentDirectory(), filepath); memWriter.Write(Encoding.UTF8.GetBytes(filepath)); memWriter.Write(byte.MinValue); } stream.Position -= 1; fileHeader.idReferencesLength = (int)stream.Position - fileHeader.idReferencesOffset; } memWriter.Write(Padding.GetBytes(stream.Position, 512)); stream.Position = 0; memWriter.Write(fileHeader.ToByteArray()); WriteFileAsync(filename, stream.ToArray()); //if (result != null) // fw.EndInvoke(result); //result = fw.BeginInvoke(filename, stream.ToArray(), null, null); }