Makecabコマンドによるファイル分割の問題について

平素は弊社製品をご愛顧いただき誠にありがとうございます。
本項では、Makecab コマンドを使用してファイルを分割する際の問題についてお伝えいたします。

あるファイルをキャビネット形式 (.cab) のファイルとしてパッケージ化したい場合、Windows OS には、
標準で Makecab というコマンドが用意されております。

Makecab
<https://technet.microsoft.com/en-us/library/hh875545.aspx>
- Package existing files into a cabinet (.cab) file.

この Makecab コマンドを利用することでファイルを複数の .cab ファイルに分割することができます。
また、Makecab コマンドでは /F オプションを指定することにより、予め用意しておいた設定ファイル(拡張子が .ddf のファイル) の情報を基に、分割後のファイル サイズを指定してファイルの分割、圧縮を実行することができます。
しかし、Makecab コマンドでファイル分割を行った場合、以下の問題が発生することがあります。

問題が発生する場合の動作詳細 1
================================
Makecab コマンドでファイルを分割する際、分割された 1 つの cab ファイルに書き込む純粋なデータ サイズは、
以下の技術情報に記載されている cab ファイルのフォーマットに記載されている通り、ヘッダー情報(CFHEADER、CFFOLDER、CFFILE) 等のサイズを除いた CFDATA のデータ部分のサイズとなります。

Microsoft Cabinet Format
<https://msdn.microsoft.com/ja-jp/library/bb417343.aspx>

しかし、Makecabコマンド内部でこのデータ部分の計算を行う際、分割元ファイルのサイズが、cabファイルのデータ部分のサイズちょうどで割り切れる場合に、分割後のファイル フォーマットが破損する現象が発生いたします。
この破損したフォーマットのファイルを結合すると、結合時にエラーが発生するか、もしくはファイル内容が破損した状態で結合されます。

分割するファイル サイズが大きい場合には、データ部分のサイズがちょうど割り切れる確率が低くなるため
発生頻度は低くなりますが、この場合も本現象が発生する可能性があります。

- 対処方法:
上述のフォーマット情報を参考に分割ファイル サイズを変更して再度実行します。

問題が発生する場合の動作詳細 2
=================================
Makecab コマンドで 3 つ以上の cab ファイルに分割した場合、これらのファイルを Explorer から展開すると
結合後のファイルが破損します。この問題は、展開時の処理において 2 つ目の cab ファイルのヘッダーに含まれるCbUncomp の値が誤判定されることに起因して発生します。

- 対処方法:
分割後の cab ファイル数が 3 つ以上にならないように分割ファイル サイズを変更して再度実行します。

 

上述いたしました Makecab コマンドの 2 つの問題は、分割した時点ではエラーが発生しないため、分割したファイルを展開して結合する際に初めて確認できる問題です。

また、これらの問題を対処するためには、事前に cab ファイルのフォーマットを意識して分割していただく必要がございますため、運用上のシステムにおいてバッチ ファイル内でファイル分割、結合を行う必要があるような場合には、makecabコマンド以外のファイル分割、結合のソリューションを併せてご検討いただけますと幸いでございます。