Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }