public async Task <bool> ExtractAll(AsarArchive archive, string destination, bool emptyDir = false) { _filesToExtract = new List <AsarFile>(); /* ENABLE FOR EMPTY FOLDERS (ONLY IF NEEDED) */ _emptyDir = emptyDir; var jObject = archive.Header.Json; if (jObject.HasValues) { TokenIterator(jObject.First); } var bytes = archive.Bytes; var progress = 0; foreach (var asarFile in _filesToExtract) { progress++; var size = asarFile.Size; var offset = archive.BaseOffset + asarFile.Offset; if (size > -1) { var fileBytes = new byte[size]; Buffer.BlockCopy(bytes, offset, fileBytes, 0, size); var filePath = $"{destination}{asarFile.Path}"; await Utils.WriteToFile(fileBytes, filePath); FileExtracted?.Invoke(this, new AsarExtractEvent(asarFile, progress, _filesToExtract.Count)); } else { if (_emptyDir) { $"{destination}{asarFile.Path}".CreateDir(); } } } Finished?.Invoke(this, true); return(true); }
public Boolean ExtractAll(AsarArchive archive, String destination, bool emptyDir = false) { _filesToExtract = new List <AsarFile>(); /* ENABLE FOR EMPTY FOLDERS (ONLY IF NEEDED) */ _emptyDir = emptyDir; JObject jObject = archive.GetHeader().GetHeaderJson(); if (jObject.HasValues) { TokenIterator(jObject.First); } byte[] bytes = archive.GetBytes(); int filesDone = 0; foreach (AsarFile aFile in _filesToExtract) { int size = aFile.GetSize(); int offset = archive.GetBaseOffset() + aFile.GetOffset(); if (size > -1) { byte[] fileBytes = new byte[size]; Buffer.BlockCopy(bytes, offset, fileBytes, 0, size); Utilities.WriteFile(fileBytes, destination + aFile.GetPath()); } else { if (_emptyDir) { Utilities.CreateDirectory(destination + aFile.GetPath()); } } filesDone++; FileExtracted?.Invoke(this, new AsarExtractEvent(aFile, filesDone, _filesToExtract.Count)); } return(false); }