BSAReader non-async factory offered

This commit is contained in:
Justin Swanson 2020-06-26 14:04:16 -05:00
parent 6b2d762e70
commit 6021716d9d
2 changed files with 16 additions and 6 deletions

View File

@ -19,7 +19,7 @@ namespace Compression.BSA
if (fourcc == TES3Reader.TES3_MAGIC)
return await TES3Reader.Load(filename);
if (fourcc == "BSA\0")
return await BSAReader.Load(filename);
return await BSAReader.LoadWithRetry(filename);
if (fourcc == "BTDX")
return await BA2Reader.Load(filename);
throw new InvalidDataException("Filename is not a .bsa or .ba2, magic " + fourcc);

View File

@ -79,13 +79,23 @@ namespace Compression.BSA
}
}
public static async ValueTask<BSAReader> Load(AbsolutePath filename)
public static async ValueTask<BSAReader> LoadWithRetry(AbsolutePath filename)
{
using var stream = await filename.OpenRead();
using var br = new BinaryReader(stream);
var bsa = new BSAReader {_rdr = br, _stream = stream, _fileName = filename};
await bsa.LoadHeaders();
var bsa = new BSAReader { _rdr = br, _stream = stream, _fileName = filename };
bsa.LoadHeaders();
bsa._rdr = null;
bsa._stream = null;
return bsa;
}
public static BSAReader Load(AbsolutePath filename)
{
using var stream = File.Open(filename.ToString(), FileMode.Open, FileAccess.Read, FileShare.Read);
using var br = new BinaryReader(stream);
var bsa = new BSAReader { _rdr = br, _stream = stream, _fileName = filename };
bsa.LoadHeaders();
bsa._rdr = null;
bsa._stream = null;
return bsa;
@ -127,7 +137,7 @@ namespace Compression.BSA
}
}
private async ValueTask LoadHeaders()
private void LoadHeaders()
{
var fourcc = Encoding.ASCII.GetString(_rdr.ReadBytes(4));