using System.Collections.Generic; using System.IO; using BizHawk.Common; namespace BizHawk.Client.Common { /// /// Implementation of IHawkFileArchiveHandler using SevenZipSharp pure managed code /// public class SevenZipSharpArchiveHandler : IHawkFileArchiveHandler { private SevenZip.SevenZipExtractor _extractor; public void Dispose() { if (_extractor != null) { _extractor.Dispose(); _extractor = null; } } public bool CheckSignature(string fileName, out int offset, out bool isExecutable) { SevenZip.FileChecker.ThrowExceptions = false; return SevenZip.FileChecker.CheckSignature(fileName, out offset, out isExecutable) != SevenZip.InArchiveFormat.None; } public IHawkFileArchiveHandler Construct(string path) { var ret = new SevenZipSharpArchiveHandler(); ret.Open(path); return ret; } private void Open(string path) { _extractor = new SevenZip.SevenZipExtractor(path); } public List Scan() { var ret = new List(); for (int i = 0; i < _extractor.ArchiveFileData.Count; i++) { var afd = _extractor.ArchiveFileData[i]; if (afd.IsDirectory) { continue; } var ai = new HawkFileArchiveItem { Name = HawkFile.Util_FixArchiveFilename(afd.FileName), Size = (long)afd.Size, ArchiveIndex = i, Index = ret.Count }; ret.Add(ai); } return ret; } public void ExtractFile(int index, Stream stream) { _extractor.ExtractFile(index, stream); } } }