Windows エクスプローラで4GB以上のファイルを圧縮し、そのファイルをTZipFileクラスで解凍すると、「項目が見つかりません」というエラーが発生する
対象となる製品
- RAD Studio 11.0 Alexandria
- C++Builder 11.0 Alexandria
- Delphi 11.0 Alexandria
問題
RAD Studio 11では、Zip64をサポートしており、TZipFileで4GB以上のファイルの圧縮/解凍が行えるようになりました。
しかし、Windows エクスプローラで4GB以上のファイルを圧縮し、そのファイルをTZipFileクラスで解凍すると、「項目が見つかりません」というエラーが発生します。
原因
ZIPファイルフォーマットでは、様々な圧縮アルゴリズムが用意されており、それを「圧縮メソッド」と呼びます。
Delphi RTLがZIPサポートのために実装しているzlibライブラリは、「Deflate」の圧縮メソッドが利用できます。
Windows エクスプローラは、4GB以上のファイルを圧縮する際、圧縮メソッドはDeflateではなくDeflate64を利用しています。
以下のコードは、DelphiのTZipFileクラスで圧縮メソッドとしてDeflate64を利用した例です。
uses System.Zip,System.IOUtils;
var
LZip: TZipFile;
LZipFile, LTextFile: string;
begin
LZipFile := TPath.Combine(TPath.GetDocumentsPath, 'testfile.zip');
LTextFile := TPath.Combine(TPath.GetDocumentsPath, 'testfile.txt');
TFile.WriteAllText(LTextFile, 'テスト');
LZip := TzipFile.Create;
try
LZip.Open(LZipFile, zmWrite);
LZip.Add(LTextFile, '', zcDeflate64);
LZip.Close;
finally
LZip.Free;
end;
end;
上記のコードを実行すると、以下のエラーが発生し、TZipFileがDeflate64をサポートしていないことが確認できます。
Windowsエクスプローラで圧縮したファイルをTZipFileで解凍した際に表示されているエラーメッセージが適切ではありませんが、DelphiのTZipFileはDeflate64をサポートしていないため、展開する際にファイルのリストから一致する項目が見つからないので、結果的にTListクラスから「項目が見つかりません」というエラーが発生しています。
エラーの原因は、上述しましたようにDelphiのTZipFileがDeflate64をサポートしていないことが理由となります。
解決
RAD Studio 11.xのTZipFileクラスは、圧縮メソッドとしてDeflate64をサポートしていないため、4GB以上のファイルを圧縮をする際は、Windows エクスプローラではなく、WinZpや7zなど圧縮メソッドとしてDeflateをサポートするサードパーティ製品をご利用ください。