diff --git a/Compression.BSA/BSADispatch.cs b/Compression.BSA/BSADispatch.cs index a208b03c..fec3073c 100644 --- a/Compression.BSA/BSADispatch.cs +++ b/Compression.BSA/BSADispatch.cs @@ -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); diff --git a/Compression.BSA/BSAReader.cs b/Compression.BSA/BSAReader.cs index 1176be00..3a085902 100644 --- a/Compression.BSA/BSAReader.cs +++ b/Compression.BSA/BSAReader.cs @@ -79,13 +79,23 @@ namespace Compression.BSA } } - - public static async ValueTask Load(AbsolutePath filename) + public static async ValueTask 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));