private static IEnumerable <ReadTestResult> Read_Archive_Items(IEnumerable <FileEntry> files) { var results = new ConcurrentBag <ReadTestResult>(); //foreach (var file in files) Parallel.ForEach(files, file => { try { if (file.Archive is not Archive ar) { return; } using var ms = new MemoryStream(); ar.CopyFileToStream(ms, file.NameHash64, false); var c = new CR2WFile { FileName = file.NameOrHash }; ms.Seek(0, SeekOrigin.Begin); var readResult = c.Read(ms); switch (readResult) { case EFileReadErrorCodes.NoCr2w: results.Add(new ReadTestResult { FileEntry = file, Success = true, ReadResult = ReadTestResult.ReadResultType.NoCr2W }); break; case EFileReadErrorCodes.UnsupportedVersion: results.Add(new ReadTestResult { FileEntry = file, Success = false, ReadResult = ReadTestResult.ReadResultType.UnsupportedVersion, Message = $"Unsupported Version ({c.GetFileHeader().version})" }); break; case EFileReadErrorCodes.NoError: var hasAdditionalBytes = c.AdditionalCr2WFileBytes != null && c.AdditionalCr2WFileBytes.Any(); var(unknownTypes, unknownBytes) = c.GetUnknownBytes(); var hasUnknownBytes = unknownBytes > 0; var res = ReadTestResult.ReadResultType.NoError; var msg = ""; if (hasAdditionalBytes) { res |= ReadTestResult.ReadResultType.HasAdditionalBytes; msg += $"Additional Bytes: {c.AdditionalCr2WFileBytes.Length}"; } if (hasUnknownBytes) { res |= ReadTestResult.ReadResultType.HasUnknownBytes; msg += $"UnknownBytes Bytes: {unknownBytes}"; } results.Add(new ReadTestResult { FileEntry = file, Success = true /*!hasAdditionalBytes && !hasUnknownBytes*/, ReadResult = res, Message = msg, AdditionalBytes = hasAdditionalBytes ? c.AdditionalCr2WFileBytes.Length : 0, UnknownBytes = hasUnknownBytes ? unknownBytes : 0, UnknownTypes = hasUnknownBytes ? unknownTypes : null, }); break; default: throw new ArgumentOutOfRangeException(); } }
private static IEnumerable <ReadTestResult> Read_Archive_Items(IEnumerable <FileEntry> files) { var results = new ConcurrentBag <ReadTestResult>(); #if IS_PARALLEL Parallel.ForEach(files, file => #else foreach (var file in files) #endif { try { var ar = s_bm.Archives.Lookup(file.Archive.ArchiveAbsolutePath).Value as Archive; using var ms = new MemoryStream(); ar?.CopyFileToStreamWithoutBuffers(ms, file.NameHash64); var c = new CR2WFile { FileName = file.NameOrHash }; ms.Seek(0, SeekOrigin.Begin); var readResult = c.Read(ms); switch (readResult) { case EFileReadErrorCodes.NoCr2w: results.Add(new ReadTestResult { FileEntry = file, Success = true, ReadResult = ReadTestResult.ReadResultType.NoCr2W }); break; case EFileReadErrorCodes.UnsupportedVersion: results.Add(new ReadTestResult { FileEntry = file, Success = false, ReadResult = ReadTestResult.ReadResultType.UnsupportedVersion, Message = $"Unsupported Version ({c.GetFileHeader().version})" }); break; case EFileReadErrorCodes.NoError: var hasAdditionalBytes = c.AdditionalCr2WFileBytes != null && c.AdditionalCr2WFileBytes.Any(); var(unknownTypes, unknownBytes) = c.GetUnknownBytes(); var hasUnknownBytes = unknownBytes > 0; var res = ReadTestResult.ReadResultType.NoError; var msg = ""; if (hasAdditionalBytes) { res |= ReadTestResult.ReadResultType.HasAdditionalBytes; msg += $"Additional Bytes: {c.AdditionalCr2WFileBytes.Length}"; } if (hasUnknownBytes) { res |= ReadTestResult.ReadResultType.HasUnknownBytes; msg += $"UnknownBytes Bytes: {unknownBytes}"; } results.Add(new ReadTestResult { FileEntry = file, Success = true /*!hasAdditionalBytes && !hasUnknownBytes*/, ReadResult = res, Message = msg, AdditionalBytes = hasAdditionalBytes ? c.AdditionalCr2WFileBytes.Length : 0, UnknownBytes = hasUnknownBytes ? unknownBytes : 0, UnknownTypes = hasUnknownBytes ? unknownTypes : null, }); break; default: throw new ArgumentOutOfRangeException(); } } catch (Exception e) { results.Add(new ReadTestResult { FileEntry = file, Success = false, ReadResult = ReadTestResult.ReadResultType.RuntimeException, ExceptionType = e.GetType(), Message = $"{e.Message}" }); } #if IS_PARALLEL });