BizHawk/BizHawk.Client.Common/SevenZipSharpArchiveHandler.cs

70 lines
1.6 KiB
C#

using System.Collections.Generic;
using System.IO;
using BizHawk.Common;
namespace BizHawk.Client.Common
{
/// <summary>
/// Implementation of IHawkFileArchiveHandler using SevenZipSharp pure managed code
/// </summary>
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<HawkFileArchiveItem> Scan()
{
var ret = new List<HawkFileArchiveItem>();
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);
}
}
}