使用 camlzip 解压缩包含多个文件的 ZIP 压缩文件

任务

压缩 / 解压缩包含多个文件的 ZIP 压缩文件

使用的 Opam 包

  • camlzip 测试版本:1.11 — 使用的库:camlzip

代码

从 ZIP 压缩文件中解压缩文件时,如果目录不存在,我们需要创建它。

let create_dir_if_not_exists filename =
  let rec aux_ensure base l =
    if not (Sys.file_exists base) then
      Sys.mkdir base 0o755
    else
      if not (Sys.is_directory base) then
        failwith "Error, file exists instead of a directory";
    match l with
    | [] -> failwith "Should not happen"
    | [ _filename ] -> ()
    | directory :: l' -> aux_ensure (base ^ "/" ^ directory) l'
  in
  match String.split_on_char '/' filename with
  | [ ] -> failwith "Should not happen (null filename)"
  | [ _filename ] -> ()
  | directory :: l -> aux_ensure directory l

打开 ZIP 文件以供读取。

let unzip zip_filename =
  let zip = Zip.open_in zip_filename in

迭代 ZIP 文件中的所有条目。

  let entries = Zip.entries zip in
  entries
  |> List.iter (fun entry ->
         Printf.printf "%s\n" entry.Zip.filename;
         create_dir_if_not_exists entry.Zip.filename;

如果条目是目录,则只需创建目录。

         if entry.Zip.is_directory then
           Sys.mkdir entry.Zip.filename 0o755

如果条目是普通文件,则解压缩它。

         else
           Zip.copy_entry_to_file
             zip
             entry
             entry.Zip.filename);

最后,关闭 ZIP 文件。

  Zip.close_in zip

食谱不工作?评论不清楚或过时了?

打开问题贡献此食谱