System.Zip.TZipFile.Extract
Delphi
procedure Extract(const FileName: string; const Path: string = ''; CreateSubdirs: Boolean = True); overload;
procedure Extract(Index: Integer; const Path: string = ''; CreateSubdirs: Boolean = True); overload;
C++
void __fastcall Extract(const System::UnicodeString FileName, const System::UnicodeString Path = System::UnicodeString(), bool CreateSubdirs = true)/* overload */;
void __fastcall Extract(int Index, const System::UnicodeString Path = System::UnicodeString(), bool CreateSubdirs = true)/* overload */;
Properties
Type | Visibility | Source | Unit | Parent |
---|---|---|---|---|
procedure function |
public | System.Zip.pas System.Zip.hpp |
System.Zip | TZipFile |
Description
Extracts a single file from the .zip archive.
FileName
specifies the file to be extracted from the .zip file. All slashes in the .zip file names should be '/'.
Index
represents the index of this file in the .zip archive.
Path
represents the location, on the disk, where the file will be extracted.
CreateSubDirs
indicates whether the output should create subdirectories specified in the .zip file. The default value forCreateSubDirs
is True.
The second overload procedure is useful when a .zip file has duplicate file names.
To track the progress of the extraction, use OnProgress.
Extracting Password-protected Files
In order to extract password-protected (encrypted) files, you can use the OnCreateDecompressStream event or the CreateDecompressStreamCallBack callback. The following example demonstrates how to use OnCreateDecompressStream to extract an encrypted file:
- Assign the OnCreateDecompressStream event:
Delphi:
... myZipFile := TZipFile.Create; myZipFile.OnCreateDecompressStream := OnCreateDecompressStream; try myZipFile.ExtractAll(''); myZipFile.Close; finally myZipFile.Free; end; ...
C++:
... std::unique_ptr<TZipFile> myZipFile(new TZipFile); myZipFile->OnCreateDecompressStream = OnCreateDecompressStream; myZipFile->ExtractAll("../../"); myZipFile->Close(); ...
- Perform decryption in your OnCreateDecompressStream function:
Delphi:
- Include the definition in the private section:
private { Private declarations } function OnCreateDecompressStream(const AInStream: TStream; const AZipFile: TZipFile; const AHeader: TZipHeader; AIsEncrypted: Boolean): TStream;
- Implement the OnCreateDecompressStream function:
function TForm1.OnCreateDecompressStream(const AInStream: TStream; const AZipFile: TZipFile; const AHeader: TZipHeader; AIsEncrypted: Boolean): TStream; begin try if AIsEncrypted then begin // Perform decrypt operation on AInStream. For example, you can use your own implementation of CryptZip or AES-256. // Result := DecryptedStream; end else Result := AInStream; except on E:Exception do begin Result := AInStream; end; end; end;
- Include the definition in the private section:
- Include the definition in you .h file:
private: // User declarations TStream* __fastcall OnCreateDecompressStream (TStream* const InStream, TZipFile* const ZipFile, const TZipHeader &Item, bool IsEncrypted);
- Implement the OnCreateDecompressStream function:
TStream* __fastcall TForm2::OnCreateDecompressStream(TStream* const InStream, TZipFile* const ZipFile, const TZipHeader &Item, bool IsEncrypted) { try { if (IsEncrypted) { // Perform decrypt operation on AInStream. For example, you can use your own implementation of CryptZip or AES-256. // return DecryptedStream; } else { return InStream; } } catch (Exception &e) { return InStream; } }
C++:
See Also
- APPNOTE.TXT - .ZIP File Format Specification (additional information regarding CryptoZip)