向量偏移/檔案結構觀察
ZIP 開啟時,電腦先回頭找最後一頁
ZIP 的效率不是把內容搬到前面;它把一份能指路的目錄折在最後,讓讀取程式先回頭找到地圖。
往下看:寫入向前,讀取回看
01/先回頭
把一個 ZIP 檔拖到桌面上,雙擊,幾十個檔名立刻排成一列。這個畫面很容易讓人以為:電腦一定從第一個位元組一路掃到最後,才知道 ZIP 裡裝了哪些檔案。
通常不是。一般 ZIP 的開啟方式比較像翻一本到最後一頁才找到目錄的書。壓縮程式先把每份資料往前寫進檔案,等全部寫完,才在尾端放上一份集中目錄,並用一筆結尾紀錄告訴讀取程式:目錄在這裡、共有多少項、長度多大。PKWARE 公開的 ZIP APPNOTE 把這些結構定義為格式的一部分。
所以,ZIP 的小祕密不是檔案被壓小了。它是把兩件不同的事拆開:建立檔案時,可以一份一份往前累積;開啟檔案時,則先回頭找到一份已整理好的地圖。
02/先寫再編
先把資料放進去,再寫目錄
想像一個假想檔案 invoice.zip,裡面有報價單、明細和照片。壓縮程式建立它時,不需要先在開頭預留一張完整清單。它可以先寫第一份檔案的在地檔頭和壓縮後資料,再寫第二份、第三份。PKWARE 對 UNIX 版 PKZIP 的說明也把這個順序描述得很直白:每個檔案先有自己的 Local Header,所有檔案寫完後才追加 Central Directory。
這個順序很適合一邊收到、一邊寫入的工作。壓縮程式在處理第一份檔案時,還不必假裝自己已經知道最後一份檔案的名稱、大小或位置。每一份資料都先落到前段,整個 ZIP 像一卷向前拉出的紙帶。
03/末端的索引
目錄留在最後,不是放錯位置
前段的紙帶只對正在寫入的程式友善。對剛打開 ZIP 的人來說,逐段讀完才能重建清單,太慢也太笨重。因此,壓縮程式在最後做了第二件事:把每份檔案的重要描述重新彙整成集中目錄。
集中目錄會重複保存讀取時很有用的資訊,例如檔名、壓縮方式、大小和指向在地資料的相對位置。它不是要取代前段資料,而是替前段資料做一份快速索引。
集中目錄:把每個檔案可被列出的描述收在一起。
結尾紀錄:告訴讀取程式集中目錄位在哪裡、規模有多大。
在地檔頭與資料:仍在前段,真正需要某個檔案時才會被讀取。
04/一次跳回
最後一頁,才是開啟的入口
接在集中目錄後面的 End of Central Directory Record,像一張折在書末的小紙條,讓讀取程式知道集中目錄要從哪裡開始找。因此,讀取程式打開 invoice.zip 時,第一個重要方向不是從開頭往右,而是從尾端往回尋找結尾紀錄。
找到結尾紀錄後,讀取程式就能定位集中目錄;讀完集中目錄後,才知道 ZIP 裡有哪些檔案,並知道每一份資料要回到前段的哪個位置。真正要打開照片時,程式才依索引中的位置回到前段,讀取那一份檔案自己的在地檔頭與壓縮資料。
讀取方向觀察台
三個視圖都在重述已寫好的正文,不補充正文前提。
資料先依序寫入
讀取時:先到尾端定位,再回到前段指定資料。
目前視圖:讀取程式先在尾端找到結尾紀錄,接著讀集中目錄,再回到照片的在地資料。
05/不是萬能捷徑
快捷鍵也有一個脆弱點
把索引留在尾端,帶來一個很容易被忽略的限制。假如 ZIP 在傳輸或儲存途中被截斷,前面一些壓縮資料可能還佔著空間,甚至檔案大小看起來不小;但只要集中目錄或結尾紀錄不見,開啟程式就可能無法走正常的列檔路徑。
PKWARE 的錯誤文件把找不到 central end record 列為 ZIP 可能不完整、受損或無法定位中央結尾紀錄的情況。這不等於每一段前方資料必然消失,也不保證修復工具一定能救回內容。它只精確地說明了一件事:原本負責告訴程式怎麼找到清單的那張地圖,已經無法正常使用。
大容量 ZIP 還會遇到另一個邊界。傳統欄位放不下某些大小或數量時,格式會以 ZIP64 的相關結構延伸記錄。這不是另一種壓縮魔法,而是同一個設計在更大尺度下,仍要讓讀取程式能找到完整目錄與正確位置。
每份檔案的在地檔頭與壓縮資料能先依序寫入。
集中目錄與結尾紀錄把清單與位置交給讀取程式。
資料佔著空間,不等於正常列檔的地圖還在。
06/留在最後的地圖
最後一頁其實是入口
下次你看到一個 ZIP 能立刻列出一長串檔名,可以把它想成一個把地圖折在最後的包裹:前段裝的是實物,尾端裝的是如何找到實物的說明。寫入者先向前走;讀取者先回頭看。
所以,若解壓工具抱怨找不到中央目錄或結尾紀錄,最實際的第一步不是猜某一份文件壞了,而是確認整個 ZIP 是否完整下載、重新取得來源檔案,或在必要時使用專門的修復工具。ZIP 檔的最後一段看起來不像內容,卻往往決定了內容能不能被正常看見。
資料來源與事實邊界
格式事實,和向量的解釋
下列來源用於確認 ZIP 的公開格式結構、寫入順序與錯誤邊界。本文的紙帶、書末目錄與地圖比喻,以及把它們帶回日常判斷的方式,都是向量的解釋。
- PKWARE/APPNOTEZIP 的資料結構與互通規格由 PKWARE 公開的 Application Note 維護。
- PKWARE/How PKZIP Works in UNIX說明 Local Header、資料寫入後,在全部檔案完成時追加 Central Directory 的流程。
- PKWARE/UNIX Error and Warning Messages限定找不到 central end record 與 ZIP 不完整、受損或無法定位結尾紀錄的關係。
- PKWARE/ZIP File Capacities說明 ZIP64 類擴充用於突破傳統 ZIP 的大小與檔案數量欄位限制。
本文不把「找不到結尾紀錄」誇大成所有資料必然遺失;是否能修復仍取決於實際損壞位置、檔案完整性與工具支援。