目錄

名稱

IO::Compress::Zip - 寫入 zip 檔案/緩衝區

語法

use IO::Compress::Zip qw(zip $ZipError) ;

my $status = zip $input => $output [,OPTS]
    or die "zip failed: $ZipError\n";

my $z = IO::Compress::Zip->new( $output [,OPTS] )
    or die "zip failed: $ZipError\n";

$z->print($string);
$z->printf($format, $string);
$z->write($string);
$z->syswrite($string [, $length, $offset]);
$z->flush();
$z->tell();
$z->eof();
$z->seek($position, $whence);
$z->binmode();
$z->fileno();
$z->opened();
$z->autoflush();
$z->input_line_number();
$z->newStream( [OPTS] );

$z->deflateParams();

$z->close() ;

$ZipError ;

# IO::File mode

print $z $string;
printf $z $format, $string;
tell $z
eof $z
seek $z, $position, $whence
binmode $z
fileno $z
close $z ;

說明

此模組提供 Perl 介面,可將 zip 壓縮資料寫入檔案或緩衝區。

此模組的主要目的是提供串流寫入存取權給 zip 檔案和緩衝區。

目前 IO::Compress::Zip 支援下列壓縮方法

儲存 (0)
縮減 (8)
Bzip2 (12)

若要寫入 Bzip2 內容,必須安裝模組 IO::Uncompress::Bunzip2

Lzma (14)

若要寫入 LZMA 內容,必須安裝模組 IO::Uncompress::UnLzma

Zstandard (93)

若要寫入 Zstandard 內容,必須安裝模組 IO::Compress::Zstd

Xz (95)

若要寫入 Xz 內容,必須安裝模組 IO::Uncompress::UnXz

若要讀取 zip 檔案/緩衝區,請參閱附屬模組 IO::Uncompress::Unzip

函式介面

提供頂層函式 zip 來執行緩衝區和/或檔案之間的「一次性」壓縮。若要更精細地控制壓縮程序,請參閱 「OO 介面」 區段。

use IO::Compress::Zip qw(zip $ZipError) ;

zip $input_filename_or_reference => $output_filename_or_reference [,OPTS]
    or die "zip failed: $ZipError\n";

函式介面需要 Perl5.005 或更新版本。

zip $input_filename_or_reference => $output_filename_or_reference [, OPTS]

zip 至少需要兩個參數,$input_filename_or_reference$output_filename_or_reference,以及零個或多個選用參數(請參閱 「選用參數」

$input_filename_or_reference 參數

參數 $input_filename_or_reference 用於定義未壓縮資料的來源。

它可以採用下列其中一種形式

A 檔案名稱

如果 $input_filename_or_reference 參數是單純的純量,則假設它是一個檔案名稱。此檔案將開啟以供讀取,且輸入資料將從中讀取。

A 檔案代號

如果 $input_filename_or_reference 參數是檔案代號,則輸入資料將從中讀取。字串「-」可用作標準輸入的別名。

A 純量參考

如果 $input_filename_or_reference 是純量參考,則輸入資料將從 $$input_filename_or_reference 讀取。

A 陣列參考

如果 $input_filename_or_reference 是陣列參考,則陣列中的每個元素都必須是檔案名稱。

輸入資料將依序從每個檔案讀取。

將會遍歷整個陣列以確保在壓縮任何資料之前,它只包含有效的檔案名稱。

A 輸入 FileGlob 字串

如果 $input_filename_or_reference 是以字元「<」和「>」分隔的字串,zip 會假設它是一個輸入 fileglob 字串。輸入是與 fileglob 相符的檔案清單。

請參閱 File::GlobMapper 以取得更多詳細資訊。

如果 $input_filename_or_reference 參數是任何其他類型,則會傳回 undef

此外,如果 $input_filename_or_reference 對應到檔案系統中的檔案名稱,則會使用輸入檔案中的下列屬性,預設填入多個 zip 檔案標頭欄位

如果您不想要使用這些預設值,則可以透過明確設定一個或多個 NameTimeTextFlagExtAttrexUnixNexTime 選項,或透過設定 Minimal 參數來覆寫它們。

$output_filename_or_reference 參數

參數 $output_filename_or_reference 用於控制壓縮資料的目的地。此參數可以採用下列其中一種形式。

A 檔案名稱

如果 $output_filename_or_reference 參數是單純的純量,則假設它是一個檔案名稱。此檔案將開啟以供寫入,且壓縮資料將寫入其中。

A 檔案代號

如果 $output_filename_or_reference 參數是檔案處理,壓縮資料將會寫入其中。字串 '-' 可用作標準輸出的別名。

純量參考

如果 $output_filename_or_reference 是純量參考,壓縮資料將會儲存在 $$output_filename_or_reference 中。

陣列參考

如果 $output_filename_or_reference 是陣列參考,壓縮資料將會推送到陣列中。

輸出檔案 glob

如果 $output_filename_or_reference 是由字元 "<" 和 ">" 區隔的字串,zip 會假設它是 輸出檔案 glob 字串。輸出是與檔案 glob 相符的檔案清單。

$output_filename_or_reference 是檔案 glob 字串時,$input_filename_or_reference 也必須是檔案 glob 字串。其他任何情況都是錯誤。

請參閱 File::GlobMapper 以取得更多詳細資訊。

如果 $output_filename_or_reference 參數是任何其他類型,將會傳回 undef

備註

$input_filename_or_reference 對應到多個檔案/緩衝區,且 $output_filename_or_reference 是單一檔案/緩衝區時,輸入檔案/緩衝區會個別儲存在 $output_filename_or_reference 中,作為一個不同的項目。

選用參數

一次性函數 zip 的選用參數(大部分)與 "建構函數選項" 區段中定義的 OO 介面所使用的相同。例外情況如下列出:

AutoClose => 0|1

此選項套用於任何輸入或輸出資料串流到 zip 的檔案處理。

如果指定 AutoClose,且值為 true,則會在 zip 完成後關閉所有輸入和/或輸出檔案處理。

此參數預設為 0。

BinModeIn => 0|1

此選項現在是 no-op。所有檔案都將以二進位模式讀取。

Append => 0|1

此選項的行為取決於輸出資料串流的類型。

  • 緩衝區

    如果啟用 Append,所有壓縮資料都將附加到輸出緩衝區的結尾。否則,在將任何壓縮資料寫入輸出緩衝區之前,將清除輸出緩衝區。

  • 檔案名稱

    如果啟用 Append,檔案將以附加模式開啟。否則,在將任何壓縮資料寫入檔案之前,將先清除檔案的內容(如果有)。

  • 檔案處理

    如果啟用 Append,將透過呼叫 seek 將檔案處理定位到檔案結尾,然後再將任何壓縮資料寫入檔案。否則,檔案指標將不會移動。

當指定 Append 並將其設定為 true 時,它會將所有壓縮資料 附加 到輸出資料串流。

因此,當輸出為檔案處理時,它會在寫入任何壓縮資料之前執行 seek 到 eof。如果輸出為檔案名稱,則會開啟它以進行附加。如果輸出為緩衝區,所有壓縮資料都將附加到現有緩衝區。

相反地,當未指定 Append,或它存在且設定為 false 時,它將執行下列操作。

當輸出為檔案名稱時,它會在寫入任何壓縮資料之前先清除檔案的內容。如果輸出為檔案處理,其位置將不會改變。如果輸出為緩衝區,它將在輸出任何壓縮資料之前被清除。

預設為 0。

範例

以下是幾個顯示模組功能的範例。

串流

這個非常簡單的命令列範例展示了模組的串流功能。程式碼從 STDIN 讀取資料,壓縮它,並將壓縮資料寫入 STDOUT。

$ echo hello world | perl -MIO::Compress::Zip=zip -e 'zip \*STDIN => \*STDOUT' >output.zip

特殊檔案名稱「-」可用作 \*STDIN\*STDOUT 的替身,因此上述範例可以改寫為

$ echo hello world | perl -MIO::Compress::Zip=zip -e 'zip "-" => "-"' >output.zip

透過查看我們剛剛建立的 zip 檔案 output.zip 的內容,可以展示直接從 STDIN 建立 zip 檔案的一個問題。

$ unzip -l output.zip
Archive:  output.zip
Length      Date    Time    Name
---------  ---------- -----   ----
    12  2019-08-16 22:21
---------                     -------
    12                     1 file

使用的檔案成員(檔案名稱)為空字串。

如果這不符合您的需求,您可以透過指定 名稱 選項來明確設定 zip 檔案中使用的檔案名稱,如下所示

echo hello world | perl -MIO::Compress::Zip=zip -e 'zip "-" => "-", Name => "hello.txt"' >output.zip

現在,zip 檔案的內容如下所示

$ unzip -l output.zip
Archive:  output.zip
Length      Date    Time    Name
---------  ---------- -----   ----
    12  2019-08-16 22:22   hello.txt
---------                     -------
    12                     1 file

從檔案系統壓縮檔案

要讀取檔案 file1.txt 的內容,並將壓縮資料寫入檔案 file1.txt.zip

use strict ;
use warnings ;
use IO::Compress::Zip qw(zip $ZipError) ;

my $input = "file1.txt";
zip $input => "$input.zip"
    or die "zip failed: $ZipError\n";

從檔案處理器讀取並寫入記憶體緩衝區

從現有的 Perl 檔案處理器 $input 讀取並將壓縮資料寫入緩衝區 $buffer

use strict ;
use warnings ;
use IO::Compress::Zip qw(zip $ZipError) ;
use IO::File ;

my $input = IO::File->new( "<file1.txt" )
    or die "Cannot open 'file1.txt': $!\n" ;
my $buffer ;
zip $input => \$buffer
    or die "zip failed: $ZipError\n";

壓縮多個檔案

建立一個 zip 檔案 output.zip,其中包含壓縮後的檔案內容 alpha.txtbeta.txt

use strict ;
use warnings ;
use IO::Compress::Zip qw(zip $ZipError) ;

zip [ 'alpha.txt', 'beta.txt' ] => 'output.zip'
    or die "zip failed: $ZipError\n";

或者,不需要明確指定每個要壓縮的檔案,可以使用檔案 glob 選擇目前目錄中的所有 txt 檔案,如下所示

use strict ;
use warnings ;
use IO::Compress::Zip qw(zip $ZipError) ;

my @files = <*.txt>;
zip \@files => 'output.zip'
    or die "zip failed: $ZipError\n";

或更簡潔地

zip [ <*.txt> ] => 'output.zip'
    or die "zip failed: $ZipError\n";

OO 介面

建構函式

IO::Compress::Zip 建構函式的格式如下所示

my $z = IO::Compress::Zip->new( $output [,OPTS] )
    or die "IO::Compress::Zip failed: $ZipError\n";

成功時傳回 IO::Compress::Zip 物件,失敗時傳回 undef。如果失敗,變數 $ZipError 將包含錯誤訊息。

如果您執行的是 Perl 5.005 或更新版本,從 IO::Compress::Zip 傳回的物件 $z 可以完全像 IO::File 檔案處理器一樣使用。這表示可以使用 $z 執行所有正常的輸出檔案操作。例如,要寫入壓縮檔案/緩衝區,可以使用以下任一種格式

$z->print("hello world\n");
print $z "hello world\n";

強制參數 $output 用於控制壓縮資料的目的地。此參數可以採用以下其中一種格式。

檔案名稱

如果 $output 參數是一個簡單的純量,則假設它是一個檔案名稱。此檔案將開啟以供寫入,並且壓縮資料將寫入其中。

檔案處理器

如果 $output 參數是一個檔案處理器,則壓縮資料將寫入其中。字串 '-' 可以用作標準輸出的別名。

純量參考

如果 $output 是純量參考,則壓縮資料將儲存在 $$output 中。

如果 $output 參數是任何其他類型,則 IO::Compress::Zip::new 將傳回 undef。

建構函式選項

OPTS 是零個或多個下列選項的組合

AutoClose => 0|1

此選項僅在 $output 參數為檔案處理時有效。如果指定,且值為 true,則會在呼叫 close 方法或銷毀 IO::Compress::Zip 物件時關閉 $output

此參數預設為 0。

Append => 0|1

以附加模式開啟 $output

此選項的行為取決於 $output 的類型。

  • 緩衝區

    如果 $output 是緩衝區且啟用 Append,所有壓縮資料都會附加到 $output 的結尾。否則,在寫入任何資料之前會清除 $output

  • 檔案名稱

    如果 $output 是檔案名稱且啟用 Append,檔案會以附加模式開啟。否則,在寫入任何壓縮資料之前,檔案的內容(如果有)會被截斷。

  • 檔案處理

    如果 $output 是檔案處理,在寫入任何壓縮資料之前,檔案指標會透過呼叫 seek 定位到檔案結尾。否則,檔案指標不會移動。

此參數預設為 0。

檔案命名選項

快速了解一下 zip 檔案術語 -- 一個 zip 檔案包含一個或多個檔案成員,其中每個成員都有關聯的檔案名稱,稱為檔案成員名稱

此區段列出的選項控制檔案成員名稱(或檔案名稱)如何儲存在 zip 檔案中。

Name => $string

此選項用於將 zip 檔案中的檔案成員名稱明確設定為 $string。大部分時候你不需要使用此選項。預設情況下,將檔案名稱新增到 zip 檔案時,檔案成員名稱 會與檔案名稱相符。

只有當你想要檔案成員名稱 與未壓縮檔案名稱不同,或輸入是檔案處理或緩衝區時,才需要使用此選項。

當未指定 Name 選項時,用於 封存成員名稱 的預設行為取決於 $input 參數的形式

  • 如果 $input 參數是檔案名稱,則 $input 的值將用於 封存成員名稱

  • 如果 $input 參數不是檔案名稱,則 封存成員名稱 將會是空字串。

請注意,CanonicalNameFilterName 選項都可以修改用於 封存成員名稱 的值。

另外請注意,如果您使用 UTF8 檔案名稱,則應將 Efs 選項設定為 true。

CanonicalName => 0|1

此選項控制在寫入 zip 檔案之前,是否將 封存成員名稱 正規化 為 Unix 格式。

建議您啟用此選項,除非您真的需要建立非標準的 Zip 檔案。

這是 APPNOTE.TXT 對於應儲存在 zip 檔案名稱標頭欄位中的內容的說明。

The name of the file, with optional relative path.
The path stored should not contain a drive or
device letter, or a leading slash.  All slashes
should be forward slashes '/' as opposed to
backwards slashes '\' for compatibility with Amiga
and UNIX file systems etc.

此選項預設為 false

FilterName => sub { ... }

此選項允許在寫入 zip 檔案之前修改 封存成員 名稱。

此選項採用一個參數,該參數必須是對子程式的參考。在進入子程式時,$_ 變數將包含要過濾的名稱。如果沒有可用的檔案名稱,則 $_ 將包含一個空字串。

子程式傳回時 $_ 的值將用作 封存成員名稱

請注意,如果啟用 CanonicalName,則會將正規化的檔案名稱傳遞給子程式。

如果您使用 FilterName 修改檔案名稱,則您有責任將檔案名稱保持為 Unix 格式。

雖然此選項可用於 OO 介面,但它最常與一次性介面一起使用。例如,以下程式碼顯示如何使用 FilterName 在將檔案名稱儲存在 $zipfile 之前,從一系列檔案名稱中移除路徑組件。

sub compressTxtFiles
{
    my $zipfile = shift ;
    my $dir     = shift ;

    zip [ <$dir/*.txt> ] => $zipfile,
        FilterName => sub { s[^$dir/][] } ;
}
Efs => 0|1

此選項控制在 zip 封存中設定「語言編碼標記」(EFS)。設定時,zip 封存的檔案名稱和註解欄位必須是有效的 UTF-8。

如果在此選項為 true 時,用於檔案名稱和/或註解的字串不是有效的 UTF-8,則腳本將會因為「寬字元」錯誤而中斷。

請注意,此選項僅適用於 Perl 5.8.4 或更新版本。

此選項預設為 false

整體 Zip 檔案結構

Minimal => 1|0

如果指定,此選項將停用在 zip 本地和中央標頭中建立所有額外欄位。因此,將會忽略 exTimeexUnix2exUnixNExtraFieldLocalExtraFieldCentral 選項。

此參數預設為 0。

Stream => 0|1

此選項控制 zip 檔案/緩衝區輸出是否以串流模式建立。

請注意,當在串流模式停用狀態下輸出到檔案(Stream 為 0)時,輸出檔案必須可尋址。

預設值為 1。

Zip64 => 0|1

建立 Zip64 zip 檔案/緩衝區。如果您要儲存大於 4 Gig 的檔案或在單一 zip 檔案中儲存超過 64K 個檔案,請使用此選項。

當使用一次性介面處理輸入為檔案名稱或純量參照時,系統會根據需要自動設定 Zip64

如果您打算使用外部 zip/unzip 工具處理使用此模組建立的 Zip64 zip 檔案,請確定它支援 Zip64。

特別是,如果您使用 Info-Zip,則需要使用版本 3.x 或更新版本的 zip 來更新 Zip64 檔案,並使用版本 6.x 的 unzip 來讀取 zip64 檔案。

預設值為 0。

Deflate 壓縮選項

-Level

定義 zlib 使用的壓縮層級。該值應為 0 到 9 之間的數字(0 表示不壓縮,9 表示最大壓縮),或下方定義的其中一個符號常數。

Z_NO_COMPRESSION
Z_BEST_SPEED
Z_BEST_COMPRESSION
Z_DEFAULT_COMPRESSION

預設值為 Z_DEFAULT_COMPRESSION。

請注意,IO::Compress::Zip 預設不會匯入這些常數。

use IO::Compress::Zip qw(:strategy);
use IO::Compress::Zip qw(:constants);
use IO::Compress::Zip qw(:all);
-Strategy

定義用於調整壓縮的策略。使用下方定義的其中一個符號常數。

Z_FILTERED
Z_HUFFMAN_ONLY
Z_RLE
Z_FIXED
Z_DEFAULT_STRATEGY

預設值為 Z_DEFAULT_STRATEGY。

Bzip2 壓縮選項

BlockSize100K => number

指定 bzip2 在壓縮期間使用的 100K 區塊數。

有效值為 1 至 9,其中 9 為最佳壓縮。

此選項僅在 Method 為 ZIP_CM_BZIP2 時才有效。否則會略過。

預設值為 1。

WorkFactor => number

指定在使用較慢的備用壓縮演算法之前,bzip2 應花費多少工作量。

有效值範圍為 0 至 250,其中 0 表示使用預設值 30。

此選項僅在 Method 為 ZIP_CM_BZIP2 時才有效。否則會略過。

預設值為 0。

Lzma 和 Xz 壓縮選項

Preset => number

用於選擇 LZMA 壓縮預設值。

有效值為 0-9 和 LZMA_PRESET_DEFAULT

0 是最快的壓縮,記憶體使用量最低,壓縮率最低。

9 是最慢的壓縮,記憶體使用量最高,但壓縮率最佳。

此選項僅在 Method 為 ZIP_CM_LZMA 時才有效。否則會略過。

預設為 LZMA_PRESET_DEFAULT (6)。

Extreme => 0|1

使 LZMA 壓縮速度變慢許多,但壓縮率略有提升。

此選項僅在 Method 為 ZIP_CM_LZMA 時才有效。否則會略過。

預設為 0。

其他選項

Time => $number

將 zip 標頭中的最後修改時間欄位設定為 $number。

如果未指定此選項且 $input 參數不是檔案名稱,則此欄位預設為建立 IO::Compress::Zip 物件的時間。

ExtAttr => $attr

此選項控制 zip 檔案中央標頭中的「外部檔案屬性」欄位。這是一個 4 位元組的欄位。

如果您正在執行 Unix 衍生產品,此值預設為

0100644 << 16

這應允許讀取/寫入從 zip 檔案/緩衝區中提取的任何檔案。

對於所有其他系統,預設值為 0。

exTime => [$atime, $mtime, $ctime]

此選項需要一個包含三個元素的陣列參考:$atimemtime$ctime。這些分別對應於最後存取時間、最後修改時間和建立時間。

它使用這些值,利用三個值 $atime、$mtime、$ctime,來設定本機 zip 標頭中的延伸時間戳記欄位(ID 為「UT」)。此外,它使用 $mtime 來設定中央 zip 標頭中的延伸時間戳記欄位。

如果三個值中的任何一個為 undef,則不會使用該時間值。因此,例如,若要只設定 $mtime,您可以使用這個

exTime => [undef, $mtime, undef]

如果 Minimal 選項設為 true,則會忽略此選項。

預設不會建立任何延伸時間欄位。

exUnix2 => [$uid, $gid]

此選項預期一個陣列參考,其中恰好有兩個元素:$uid$gid。這些值分別對應於檔案擁有者的數字使用者 ID (UID) 和群組 ID (GID)。

exUnix2 選項存在時,它會觸發在本地 zip 標頭中建立 Unix2 額外欄位(ID 為「Ux」)。這會以 $uid$gid 填入。一個空的 Unix2 額外欄位也會建立在中央 zip 標頭中。

注意 - UID 和 GID 儲存在「Ux」欄位中,為 16 位元整數。如果您的 UID 或 GID 為 32 位元,請使用 exUnixN

如果 Minimal 選項設為 true,則會忽略此選項。

預設不會建立任何 Unix2 額外欄位。

exUnixN => [$uid, $gid]

此選項預期一個陣列參考,其中恰好有兩個元素:$uid$gid。這些值分別對應於檔案擁有者的數字使用者 ID (UID) 和群組 ID (GID)。

exUnixN 選項存在時,它會觸發在本地和中央 zip 標頭中建立 UnixN 額外欄位(ID 為「ux」)。這會以 $uid$gid 填入。UID 和 GID 儲存在 32 位元整數中。

如果 Minimal 選項設為 true,則會忽略此選項。

預設不會建立任何 UnixN 額外欄位。

Comment => $comment

$comment 的內容儲存在 zip 檔案的中央檔案標頭中。

如果您想要儲存 UTF8 註解,請將 Efs 選項設為 true。

預設不會將任何註解欄位寫入 zip 檔案。

ZipComment => $comment

$comment 的內容儲存在 zip 檔案的中央目錄結束記錄中。

預設不會將任何註解欄位寫入 zip 檔案。

Method => $method

控制使用哪種壓縮方法。目前支援的壓縮方法有:儲存(完全不壓縮)、Deflate、Bzip2、Zstd、Xz 和 Lzma。

符號 ZIP_CM_STORE、ZIP_CM_DEFLATE、ZIP_CM_BZIP2、ZIP_CM_ZSTD、ZIP_CM_XZ 和 ZIP_CM_LZMA 用於選取壓縮方法。

這些常數並未由 IO::Compress::Zip 預設匯入。

use IO::Compress::Zip qw(:zip_method);
use IO::Compress::Zip qw(:constants);
use IO::Compress::Zip qw(:all);

請注意,若要建立 Bzip2 內容,必須安裝模組 IO::Compress::Bzip2。若在 IO::Compress::Bzip2 不可用時嘗試建立 Bzip2 內容,將會擲出致命錯誤。

請注意,若要建立 Lzma 內容,必須安裝模組 IO::Compress::Lzma。若在 IO::Compress::Lzma 不可用時嘗試建立 Lzma 內容,將會擲出致命錯誤。

請注意,若要建立 Xz 內容,必須安裝模組 IO::Compress::Xz。若在 IO::Compress::Xz 不可用時嘗試建立 Xz 內容,將會擲出致命錯誤。

請注意,若要建立 Zstd 內容,必須安裝模組 IO::Compress::Zstd。若在 IO::Compress::Zstd 不可用時嘗試建立 Zstd 內容,將會擲出致命錯誤。

預設方法為 ZIP_CM_DEFLATE。

TextFlag => 0|1

此參數控制 zip 中央標頭中位元的設定。用於表示儲存在 zip 檔案/緩衝區中的資料可能是文字。

在一次性模式中,如果 Perl -T 算子認為檔案包含文字,則此旗標將設為 true。

預設值為 0。

ExtraFieldLocal => $data
ExtraFieldCentral => $data

ExtraFieldLocal 選項用於在 zip 檔案/緩衝區的本機標頭中儲存額外的元資料。ExtraFieldCentral 對應的中央標頭也執行相同的動作。

額外欄位包含零個或多個子欄位。每個子欄位包含兩個位元的標頭,後接子欄位資料。

子欄位的清單可以使用下列任何一種格式提供

ExtraFieldLocal => [$id1, $data1,
                    $id2, $data2,
                     ...
                   ]

ExtraFieldLocal => [ [$id1 => $data1],
                     [$id2 => $data2],
                     ...
                   ]

ExtraFieldLocal => { $id1 => $data1,
                     $id2 => $data2,
                     ...
                   }

其中 $id1$id2 是兩個位元的子欄位 ID。

如果您使用 hash 語法,您無法控制 ExtraSubFields 儲存的順序,而且您無法擁有 ID 重複的 SubFields。

或者,子欄位的清單可以提供為純量,如下所示

ExtraField => $rawdata

在這種情況下,IO::Compress::Zip 將檢查 $rawdata 是否包含零個或多個符合的子欄位。

使用 exTime 選項設定的延伸時間欄位 (ID「UT」),以及使用 exUnix2 選項設定的 Unix2 額外欄位 (ID「Ux」),都是額外欄位的範例。

如果 Minimal 選項設為 true,則會忽略此選項。

額外欄位的最大大小為 65535 位元組。

Strict => 0|1

這是佔位符選項。

範例

待辦事項

方法

列印

用法為

$z->print($data)
print $z $data

壓縮並輸出 $data 參數的內容。這與內建的 print 行為相同。

如果成功,傳回 true。

printf

用法為

$z->printf($format, $data)
printf $z $format, $data

壓縮並輸出 $data 參數的內容。

如果成功,傳回 true。

syswrite

用法為

$z->syswrite $data
$z->syswrite $data, $length
$z->syswrite $data, $length, $offset

壓縮並輸出 $data 參數的內容。

傳回未壓縮的寫入位元組數,或在不成功時傳回 undef

寫入

用法為

$z->write $data
$z->write $data, $length
$z->write $data, $length, $offset

壓縮並輸出 $data 參數的內容。

傳回未壓縮的寫入位元組數,或在不成功時傳回 undef

快取

用法為

$z->flush;
$z->flush($flush_type);

將任何待處理的壓縮資料快取到輸出檔案/緩衝區。

此方法採用一個選用參數 $flush_type,用來控制快取的執行方式。預設使用的 $flush_typeZ_FINISH$flush_type 的其他有效值為 Z_NO_FLUSHZ_SYNC_FLUSHZ_FULL_FLUSHZ_BLOCK。強烈建議您只有在完全了解其執行意涵時才設定 flush_type 參數,過度使用 flush 會嚴重降低達成的壓縮等級。請參閱 zlib 文件以取得詳細資料。

如果成功,傳回 true。

tell

用法為

$z->tell()
tell $z

傳回未壓縮的檔案偏移量。

eof

用法為

$z->eof();
eof($z);

如果已呼叫 close 方法,傳回 true。

seek

$z->seek($position, $whence);
seek($z, $position, $whence);

提供 seek 功能的子集,限制僅能向前尋找輸出檔案/緩衝區。嘗試向後尋找是致命的錯誤。

檔案/緩衝區的空白部分將寫入 NULL (0x00) 位元組。

$whence 參數採用一般值之一,即 SEEK_SET、SEEK_CUR 或 SEEK_END。

如果成功,傳回 1;如果失敗,傳回 0。

binmode

用法為

$z->binmode
binmode $z ;

這是為了完整性而提供的無操作。

opened

$z->opened()

如果物件目前參照開啟的檔案/緩衝區,則傳回 true。

autoflush

my $prev = $z->autoflush()
my $prev = $z->autoflush(EXPR)

如果 $z 物件與檔案或檔案控制代碼相關聯,此方法會傳回底層檔案控制代碼的目前自動快取設定。如果 EXPR 存在且非零,它會在每次寫入/列印作業後啟用快取。

如果 $z 與緩衝區相關聯,此方法不會產生作用,且總是傳回 undef

請注意,特殊變數 $| 無法用來設定或擷取自動快取設定。

input_line_number

$z->input_line_number()
$z->input_line_number(EXPR)

在壓縮時,此方法總是傳回 undef

fileno

$z->fileno()
fileno($z)

如果 $z 物件與檔案或檔案控制代碼相關聯,fileno 會傳回底層檔案描述符。一旦呼叫 close 方法,fileno 會傳回 undef

如果 $z 物件與緩衝區相關聯,此方法會傳回 undef

close

$z->close() ;
close $z ;

快取任何待處理的壓縮資料,然後關閉輸出檔案/緩衝區。

對於大多數版本的 Perl,如果 IO::Compress::Zip 物件被銷毀(明確地或透過具有物件參考的變數超出範圍),此方法會自動呼叫。例外是 Perl 版本 5.005 至 5.00504 和 5.8.0。在這些情況下,close 方法會自動呼叫,但直到程式終止時所有執行中物件的全球銷毀。

因此,如果您希望您的指令碼可以在所有版本的 Perl 上執行,您應該明確呼叫 close,而不依賴自動關閉。

成功時傳回 true,否則傳回 0。

如果在建立 IO::Compress::Zip 物件時已啟用 AutoClose 選項,且物件與檔案相關聯,底層檔案也會被關閉。

newStream([OPTS])

用法為

$z->newStream( [OPTS] )

關閉目前的壓縮資料串流,並開始一個新的串流。

OPTS 包含在建立 $z 物件時可用的任何選項。

有關更多詳細資訊,請參閱 "建構函式選項" 區段。

deflateParams

用法為

$z->deflateParams

待辦事項

匯入

IO::Compress::Zip 中的某些方法需要一些符號常數。預設情況下不會匯入任何常數。

:all

匯入 zip$ZipErrorIO::Compress::Zip 可使用的所有符號常數。與執行下列動作相同

use IO::Compress::Zip qw(zip $ZipError :constants) ;
:constants

匯入所有符號常數。與執行下列動作相同

use IO::Compress::Zip qw(:flush :level :strategy :zip_method) ;
:flush

flush 方法使用這些符號常數。

Z_NO_FLUSH
Z_PARTIAL_FLUSH
Z_SYNC_FLUSH
Z_FULL_FLUSH
Z_FINISH
Z_BLOCK
:level

建構函式中的 Level 選項使用這些符號常數。

Z_NO_COMPRESSION
Z_BEST_SPEED
Z_BEST_COMPRESSION
Z_DEFAULT_COMPRESSION
:strategy

建構函式中的 Strategy 選項使用這些符號常數。

Z_FILTERED
Z_HUFFMAN_ONLY
Z_RLE
Z_FIXED
Z_DEFAULT_STRATEGY
:zip_method

建構函式中的 Method 選項使用這些符號常數。

ZIP_CM_STORE
ZIP_CM_DEFLATE
ZIP_CM_BZIP2

範例

Apache::GZip 再探

請參閱 IO::Compress::FAQ

與 Net::FTP 搭配使用

請參閱 IO::Compress::FAQ

支援

一般回饋/問題/錯誤報告應傳送至 https://github.com/pmqs/IO-Compress/issues(建議)或 https://rt.cpan.org/Public/Dist/Display.html?Name=IO-Compress

另請參閱

Compress::ZlibIO::Compress::GzipIO::Uncompress::GunzipIO::Compress::DeflateIO::Uncompress::InflateIO::Compress::RawDeflateIO::Uncompress::RawInflateIO::Compress::Bzip2IO::Uncompress::Bunzip2IO::Compress::LzmaIO::Uncompress::UnLzmaIO::Compress::XzIO::Uncompress::UnXzIO::Compress::LzipIO::Uncompress::UnLzipIO::Compress::LzopIO::Uncompress::UnLzopIO::Compress::LzfIO::Uncompress::UnLzfIO::Compress::ZstdIO::Uncompress::UnZstdIO::Uncompress::AnyInflateIO::Uncompress::AnyUncompress

IO::Compress::FAQ

File::GlobMapperArchive::ZipArchive::TarIO::Zlib

有關 RFC 1950、1951 和 1952,請參閱 https://datatracker.ietf.org/doc/html/rfc1950https://datatracker.ietf.org/doc/html/rfc1951https://datatracker.ietf.org/doc/html/rfc1952

zlib 壓縮函式庫由 Jean-loup Gailly gzip@prep.ai.mit.edu 和 Mark Adler madler@alumni.caltech.edu 編寫。

zlib 壓縮函式庫的主要網站為 http://www.zlib.org

zlib-ng 壓縮函式庫的主要網站為 https://github.com/zlib-ng/zlib-ng

gzip 的主要網站為 http://www.gzip.org

作者

此模組由 Paul Marquess pmqs@cpan.org 編寫。

修改記錄

請參閱 Changes 檔案。

著作權和授權

著作權所有 (c) 2005-2023 Paul Marquess。保留所有權利。

此程式為自由軟體;您可以在與 Perl 相同的條款下重新散布和/或修改它。