public static PboFile FromStream(Stream input, PboLoadMode mode = PboLoadMode.Immediate) { var pbo = new PboFile(); while (input.Position < input.Length) { var e = new PboEntry(); e.ReadHeader(input); if (e.Path.Length == 0) { if (pbo._entries.Count != 0) { //this is the end of header marker break; } //this is a header extension so slurp up strings while (BinaryFile.ReadString(input).Length != 0) { } //System.Console.WriteLine("skipping " + config); ; } else { pbo._entries.Add(e); } } foreach (var pf in pbo) { pf.ReadBody(input, -1, mode); } return(pbo); }
public static PboFile FromPbo(string fileName, PboLoadMode mode = PboLoadMode.Immediate) { var fs = File.OpenRead(fileName); var pbo = FromStream(fs, mode); if (mode == PboLoadMode.Immediate) { fs.Close(); } pbo.FileName = System.IO.Path.GetFileName(fileName); pbo._sourceFolder = System.IO.Path.GetDirectoryName(fileName); return(pbo); }
/* * Internal function used to read the actual file contents of a PboEntry from a stream */ internal void ReadBody(Stream sr, long offset, PboLoadMode mode) { if (offset < 0) { offset = sr.Position; } if (mode == PboLoadMode.Immediate) { FileContents = new byte[DataSize]; sr.Seek(offset, SeekOrigin.Begin); sr.Read(FileContents, 0, DataSize); } else { //save the position and skip past _input = sr; _offset = offset; sr.Seek(DataSize, SeekOrigin.Current); } }
/* * Internal function used to read the actual file contents of a PboEntry from a stream */ internal void ReadBody(Stream sr, long offset, PboLoadMode mode) { if (offset < 0) offset = sr.Position; if (mode == PboLoadMode.Immediate) { FileContents = new byte[DataSize]; sr.Seek(offset, SeekOrigin.Begin); sr.Read(FileContents, 0, DataSize); } else { //save the position and skip past _input = sr; _offset = offset; sr.Seek(DataSize, SeekOrigin.Current); } }