diff --git a/BinaryObjectScanner/FileType/MicrosoftCAB.cs b/BinaryObjectScanner/FileType/MicrosoftCAB.cs
index 0f1a1139..66031ceb 100644
--- a/BinaryObjectScanner/FileType/MicrosoftCAB.cs
+++ b/BinaryObjectScanner/FileType/MicrosoftCAB.cs
@@ -197,32 +197,45 @@ namespace BinaryObjectScanner.FileType
// Loop through the files
for (int i = 0; i < files.Length; i++)
{
- try
- {
- var compressedFile = files[i];
- blockStream.Seek(compressedFile.FolderStartOffset, SeekOrigin.Begin);
- byte[] fileData = blockStream.ReadBytes((int)compressedFile.FileSize);
+ var file = files[i];
+ ExtractFile(outDir, blockStream, file, includeDebug);
+ }
+ }
- // Ensure directory separators are consistent
- string fileName = compressedFile.Name!;
- if (Path.DirectorySeparatorChar == '\\')
- fileName = fileName.Replace('/', '\\');
- else if (Path.DirectorySeparatorChar == '/')
- fileName = fileName.Replace('\\', '/');
+ ///
+ /// Extract the contents of a single file
+ ///
+ /// Path to the output directory
+ /// Stream representing the uncompressed block data
+ /// File information
+ /// True to include debug data, false otherwise
+ /// TODO: Remove once Serialization is updated
+ private static void ExtractFile(string outDir, Stream blockStream, CFFILE file, bool includeDebug)
+ {
+ try
+ {
+ blockStream.Seek(file.FolderStartOffset, SeekOrigin.Begin);
+ byte[] fileData = blockStream.ReadBytes((int)file.FileSize);
- string tempFile = Path.Combine(outDir, fileName);
- var directoryName = Path.GetDirectoryName(tempFile);
- if (directoryName != null && !Directory.Exists(directoryName))
- Directory.CreateDirectory(directoryName);
+ // Ensure directory separators are consistent
+ string fileName = file.Name!;
+ if (Path.DirectorySeparatorChar == '\\')
+ fileName = fileName.Replace('/', '\\');
+ else if (Path.DirectorySeparatorChar == '/')
+ fileName = fileName.Replace('\\', '/');
- using var of = File.OpenWrite(tempFile);
- of.Write(fileData, 0, fileData.Length);
- of.Flush();
- }
- catch (Exception ex)
- {
- if (includeDebug) Console.WriteLine(ex);
- }
+ string tempFile = Path.Combine(outDir, fileName);
+ var directoryName = Path.GetDirectoryName(tempFile);
+ if (directoryName != null && !Directory.Exists(directoryName))
+ Directory.CreateDirectory(directoryName);
+
+ using var of = File.OpenWrite(tempFile);
+ of.Write(fileData, 0, fileData.Length);
+ of.Flush();
+ }
+ catch (Exception ex)
+ {
+ if (includeDebug) Console.WriteLine(ex);
}
}