2013-07-23 6 views
3

Я хотел бы манипулировать одним из наших (неподписанных) файлов CAB, созданных с помощью CABWIZ, путем замены файла в шкафу. В настоящее время я использую Microsoft.Deployment.Compression.Cab.dll для этой задачи (извлеките все файлы, замените цель, заново создайте шкаф), который работает довольно хорошо, так как я долго не включаю сжатие.Сжатые файлы CAB не могут быть установлены WCELOAD

cabInfo.Pack(workingFolder.FullName, true, CompressionLevel.None, null); 

Как только я включить сжатие, WM 6.5.3 не будет устанавливать файл CAB больше:

Установка CABFILE оказалась неудачной.

Оригинальный файл, созданный CABWIZ, сжат, поэтому я знаю, что WCELOAD в WM может обрабатывать сжатые файлы. Я искал параметры конфигурации для библиотеки Microsoft, но не нашел.

Есть ли способ создать сжатый CAB с библиотекой Microsoft или какие-либо другие библиотеки, которые могут быть использованы для этой задачи? Существует множество библиотек для управления CAB-файлами, но я не мог найти информацию об одном, который может создавать сжатые файлы CAB, совместимые с WCELOAD.

Обновление: После некоторого исследования я обнаружил, что WCELOAD поддерживает алгоритм MSZIP, тогда как в библиотеке Microsoft используется LZX. Поэтому я ищу библиотеку, способную создавать сжатые CAB-файлы с использованием алгоритма MSZIP.

ответ

2

Пакер, используемый Microsoft.Deployment.Compression.Cab.dll, является управляемой оболочкой вокруг системного файла cabinet.dll, который поддерживает алгоритм MSZIP. Поскольку MS-RL не является проблемой для моего проекта, я скачал WIX sources и модифицировал библиотеку сжатия САВ, как это:

CompressionLevel.cs

public enum CompressionLevel 
{ 
    /// <summary>Do not compress files, only store.</summary> 
    None = 0, 

    /// <summary>Minimum compression; fastest.</summary> 
    Min = 1, 

    /// <summary>A compromize between speed and compression efficiency.</summary> 
    Normal = 6, 

    /// <summary>Maximum compression; slowest.</summary> 
    Max = 10, 

    /// <summary>Compress files using the MSZIP algorithm.</summary> 
    MsZip = 11 
} 

CabPacker.cs

private static NativeMethods.FCI.TCOMP GetCompressionType(CompressionLevel compLevel) 
{ 
    if (compLevel == CompressionLevel.MsZip) 
    { 
    return NativeMethods.FCI.TCOMP.TYPE_MSZIP; 
    } 
    else 
    { 
    // existing code goes here 
    } 
} 

Сжатый с помощью алгоритма MSZIP, WCELOAD действительно создает созданные CAB-файлы без каких-либо проблем.

Смежные вопросы