/// <summary> /// Loads the archive from a header and data stream with specified filename. /// </summary> /// <param name="headerStream">The stream from the RFH file.</param> /// <param name="dataStream">The stream from the RFD file.</param> /// <returns>A <see cref="ResourceArchive"/> with the loaded streams' data.</returns> public ResourceArchive ReadArchive(Stream headerStream, Stream dataStream) { this.headerStream = headerStream; this.dataStream = dataStream; var archive = new ResourceArchive(); using (headerReader = new BinaryReader(headerStream)) using (dataReader = new BinaryReader(dataStream)) { do { var pathLen = headerReader.ReadUInt32(); var timestamp = DateTimeOffset.FromUnixTimeSeconds(headerReader.ReadUInt32()).DateTime; var cmpType = (ResourceCompressionType)headerReader.ReadUInt32(); var cmpSize = headerReader.ReadUInt32(); var offset = headerReader.ReadUInt32(); var relPath = headerReader.ReadBytes((int)pathLen); dataReader.BaseStream.Seek(offset, SeekOrigin.Begin); var data = dataReader.ReadBytes((int)cmpSize); archive.resources.Add(new ResourceFile { filepath = Encoding.ASCII.GetString(relPath).Trim('\0'), // Null terminated strings aren't a thing in C#. timestamp = timestamp, compressionType = cmpType, compressedSize = cmpSize, offset = offset, data = data }); archive.nextOffset = offset + cmpSize; }while (headerReader.BaseStream.Position < headerReader.BaseStream.Length); } return(archive); }
public void TestZip2() { var zip = new ZipArchive(); zip.Load(ResourceArchive.GetFlash0ZipFileStream()); foreach (var entry in zip) { Console.Error.WriteLine(entry); } }
/// <summary> /// Saves the archive as a header and data file with specified filename. /// </summary> /// <param name="archive">The archive to save.</param> /// <param name="file">The file to save to. Extensions are optional.</param> /// <exception cref="IOException"></exception> public void WriteArchive(ResourceArchive archive, string file) { var fileExt = Path.GetExtension(file).ToLower(); if (fileExt == ".rfh" || fileExt == ".rfd") { file = Path.ChangeExtension(file, null); } headerStream = new FileStream(file + ".rfh", FileMode.CreateNew); dataStream = new FileStream(file + ".rfd", FileMode.CreateNew); WriteArchive(archive, headerStream, dataStream); }
static void Main(string[] args) { var resArchive = new ResourceArchive(); resArchive.Add("test.txt"); //, ResourceCompressionType.Best); resArchive.Add("smile.png"); //, ResourceCompressionType.Fast); try { var writer = new RfWriter(); writer.WriteArchive(resArchive, "tomata"); } catch (IOException) { Console.WriteLine("there was a problem saving the file. it probably exists."); } }
void RegisterDevices() { var memoryStickRootFolder = ApplicationPaths.MemoryStickRootFolder; //Console.Error.WriteLine(MemoryStickRootFolder); //Console.ReadKey(); try { Directory.CreateDirectory(memoryStickRootFolder); } catch (Exception e) { Console.WriteLine(e); } /* */ MemoryStickMountable = new HleIoDriverMountable(); MemoryStickMountable.Mount("/", new HleIoDriverLocalFileSystem(memoryStickRootFolder)); var memoryStick = new HleIoDriverMemoryStick(PspMemory, HleCallbackManager, MemoryStickMountable); //var MemoryStick = new HleIoDriverMemoryStick(new HleIoDriverLocalFileSystem(VirtualDirectory).AsReadonlyHleIoDriver()); // http://forums.ps2dev.org/viewtopic.php?t=5680 HleIoManager.SetDriver("host:", memoryStick); HleIoManager.SetDriver("ms:", memoryStick); HleIoManager.SetDriver("fatms:", memoryStick); HleIoManager.SetDriver("fatmsOem:", memoryStick); HleIoManager.SetDriver("mscmhc:", memoryStick); HleIoManager.SetDriver("msstor:", new ReadonlyHleIoDriver(memoryStick)); HleIoManager.SetDriver("msstor0p:", new ReadonlyHleIoDriver(memoryStick)); HleIoManager.SetDriver("disc:", memoryStick); HleIoManager.SetDriver("umd:", memoryStick); HleIoManager.SetDriver("emulator:", HleIoDriverEmulator); HleIoManager.SetDriver("kemulator:", HleIoDriverEmulator); HleIoManager.SetDriver("flash:", new HleIoDriverZip(new ZipArchive(ResourceArchive.GetFlash0ZipFileStream()))); }
/// <summary> /// Saves the archive as a header and data file with specified streams. /// </summary> /// <param name="archive">The archive to save.</param> /// <param name="headerStream">The stream for the RFH file being written to.</param> /// <param name="dataStream">The stream for the RFD file being written to.</param> /// <exception cref="IOException"></exception> public void WriteArchive(ResourceArchive archive, Stream headerStream, Stream dataStream) { this.headerStream = headerStream; this.dataStream = dataStream; using (headerWriter = new BinaryWriter(headerStream)) using (dataWriter = new BinaryWriter(dataStream)) { foreach (var resFile in archive.resources) { headerWriter.Write(resFile.filepath.Length + 1); // Compensates for null terminator to be added. headerWriter.Write((uint)((DateTimeOffset)resFile.timestamp).ToUnixTimeSeconds()); headerWriter.Write((uint)resFile.compressionType); headerWriter.Write(resFile.compressedSize); headerWriter.Write(resFile.offset); headerWriter.Write(Encoding.ASCII.GetBytes(resFile.filepath + "\0")); dataWriter.Write(resFile.data); } } }
public void Initialize() { archive = new ResourceArchive(); shellViewModel.Archive = archive; }