public static bool RemoveArchiveEntry(string psarcPath, string entryName) { if (!File.Exists(psarcPath)) { return(false); } using (PSARC archive = new PSARC(true)) using (var psarcStream = File.OpenRead(psarcPath)) { archive.Read(psarcStream); psarcStream.Dispose(); // CRITICAL var tocEntry = archive.TOC.FirstOrDefault(entry => entry.Name == entryName); if (tocEntry == null) { archive.Dispose(); // CRITICAL return(true); } archive.TOC.Remove(tocEntry); archive.TOC.Insert(0, new Entry() { Name = "NamesBlock.bin" }); using (var fs = File.Create(psarcPath)) archive.Write(fs, true); archive.Dispose(); // CRITICAL return(true); } }
// Loads song archive file to memory. public PsarcLoader(string fileName, bool useMemory = true) { _filePath = fileName; _archive = new PSARC(useMemory); _fileStream = File.OpenRead(_filePath); _archive.Read(_fileStream); }
public static string ExtractArchiveFile(string psarcPath, string entryNamePath, string outputDir) { if (!File.Exists(psarcPath)) { return(""); } using (PSARC archive = new PSARC(true)) using (var psarcStream = File.OpenRead(psarcPath)) { archive.Read(psarcStream, true); var tocEntry = archive.TOC.Where(entry => entry.Name.Contains(entryNamePath)).FirstOrDefault(); if (tocEntry != null) { if (!Directory.Exists(outputDir)) { Directory.CreateDirectory(outputDir); } archive.InflateEntry(tocEntry, Path.Combine(outputDir, Path.GetFileName(tocEntry.ToString()))); return(Path.Combine(outputDir, tocEntry.ToString())); } return(""); } }
public static bool InjectArchiveEntry(string psarcPath, string entryName, string sourcePath, bool useMemory = true) { if (!File.Exists(psarcPath)) { return(false); } using (PSARC archive = new PSARC(useMemory)) using (var psarcStream = File.OpenRead(psarcPath)) { try { archive.Read(psarcStream); psarcStream.Dispose(); // CRITICAL var entryStream = new MemoryStream(); using (var sourceStream = File.OpenRead(sourcePath)) sourceStream.CopyTo(entryStream); entryStream.Position = 0; Entry tocEntry = archive.TOC.FirstOrDefault(x => x.Name == entryName); if (tocEntry != null) { tocEntry.Data.Dispose(); // CRITICAL tocEntry.Data = entryStream; } else { archive.AddEntry(entryName, entryStream); // evil genius ... ;) => forces archive update archive.TOC.Insert(0, new Entry() { Name = "NamesBlock.bin" }); } } catch { archive.Dispose(); // CRITICAL return(false); } using (var fs = File.Create(psarcPath)) archive.Write(fs, true); archive.Dispose(); // CRITICAL return(true); } }
public static Stream ExtractArchiveFile(string psarcPath, string entryNamePath) { if (!File.Exists(psarcPath)) { return(null); } using (PSARC archive = new PSARC(true)) using (var psarcStream = File.OpenRead(psarcPath)) { archive.Read(psarcStream, true); var tocEntry = archive.TOC.FirstOrDefault(x => (x.Name.Equals(entryNamePath))); if (tocEntry != null) { archive.InflateEntry(tocEntry); return(tocEntry.Data); } } return(null); }
public static Stream ExtractPSARCData(this Stream stream, Func <Entry, bool> dataEntry) { using (PSARC p = new PSARC(true)) { p.Read(stream, true); var de = p.TOC.Where(dataEntry).FirstOrDefault(); if (de != null) { MemoryStream ms = new MemoryStream(); p.InflateEntry(de); if (de.Data == null) { return(null); } de.Data.Position = 0; de.Data.CopyTo(ms); ms.Position = 0; return(ms); } return(null); } }
public ArcFileWrapper(string archiveFile) { _psarc = new PSARC(); _archiveFile = archiveFile; using (var inputStream = System.IO.File.OpenRead(archiveFile)) { _psarc.Read(inputStream); } }