70 lines
1.6 KiB
C#
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);
|
|
}
|
|
}
|
|
} |