2020-09-10 21:10:32 -07:00
using System ;
using System.IO ;
2023-03-09 14:04:31 -05:00
using BinaryObjectScanner.Interfaces ;
2023-03-07 16:59:14 -05:00
using BinaryObjectScanner.Wrappers ;
2020-09-10 21:10:32 -07:00
2023-03-10 13:48:24 -05:00
namespace BinaryObjectScanner.FileType
2020-09-10 21:10:32 -07:00
{
2022-12-08 21:32:52 -08:00
/// <summary>
/// Microsoft cabinet file
/// </summary>
/// <remarks>Specification available at <see href="http://download.microsoft.com/download/5/0/1/501ED102-E53F-4CE0-AA6B-B0F93629DDC6/Exchange/%5BMS-CAB%5D.pdf"/></remarks>
2022-12-28 23:07:23 -08:00
/// <see href="https://github.com/wine-mirror/wine/tree/master/dlls/cabinet"/>
2023-03-09 15:07:35 -05:00
public class MicrosoftCAB : IExtractable
2020-09-10 21:10:32 -07:00
{
2023-03-09 14:04:31 -05:00
/// <inheritdoc/>
2023-03-09 17:16:39 -05:00
public string Extract ( string file , bool includeDebug )
2023-03-09 14:04:31 -05:00
{
if ( ! File . Exists ( file ) )
return null ;
using ( var fs = File . Open ( file , FileMode . Open , FileAccess . Read , FileShare . Read ) )
{
2023-03-09 17:16:39 -05:00
return Extract ( fs , file , includeDebug ) ;
2023-03-09 14:04:31 -05:00
}
}
/// <inheritdoc/>
2023-03-09 17:16:39 -05:00
public string Extract ( Stream stream , string file , bool includeDebug )
2023-03-09 14:04:31 -05:00
{
2023-03-09 17:16:39 -05:00
try
{
// Open the cab file
var cabFile = MicrosoftCabinet . Create ( stream ) ;
if ( cabFile = = null )
return null ;
2023-03-09 14:39:26 -05:00
2023-03-09 17:16:39 -05:00
// Create a temp output directory
string tempPath = Path . Combine ( Path . GetTempPath ( ) , Guid . NewGuid ( ) . ToString ( ) ) ;
Directory . CreateDirectory ( tempPath ) ;
2023-03-09 14:39:26 -05:00
2023-03-09 17:16:39 -05:00
// If entry extraction fails
bool success = cabFile . ExtractAll ( tempPath ) ;
if ( ! success )
return null ;
2023-03-09 14:39:26 -05:00
2023-03-09 17:16:39 -05:00
return tempPath ;
}
catch ( Exception ex )
{
if ( includeDebug ) Console . WriteLine ( ex ) ;
return null ;
}
2023-03-09 14:04:31 -05:00
}
2020-09-10 21:10:32 -07:00
}
}