提取ZIP文件,包括隐藏文件



>我正在使用ZipArchive,我想提取ZIP文件。我可以在ZipArchive::extractTo的文档中看到一条评论:

请注意,在Linux(也可能是其他*nix平台(中,无法从Zip存档中提取隐藏文件(又名以"."开头的文件名(。

非常重要的提示:我需要它在*nix和Windows平台上工作。

那么如何正确地将ZIP文件提取到目录中,包括隐藏文件?

提前感谢,杰克.

如果

服务器允许,您可以使用system()exec()函数:

system("unzip archive.zip");

虽然有shell_exec()passthru().

希望对您有所帮助。

编辑

由于 OP 正在寻找纯 php 解决方案,因此这里是用户实现的 php 手册(Zip 函数(函数:

<?php
/**
* Unzip the source_file in the destination dir
*
* @param   string      The path to the ZIP-file.
* @param   string      The path where the zipfile should be unpacked, if false the directory of the zip-file is used
* @param   boolean     Indicates if the files will be unpacked in a directory with the name of the zip-file (true) or not (false) (only if the destination directory is set to false!)
* @param   boolean     Overwrite existing files (true) or not (false)
* 
* @return  boolean     Succesful or not
*/
function unzip($src_file, $dest_dir=false, $create_zip_name_dir=true, $overwrite=true)
{
  if ($zip = zip_open($src_file))
  {
    if ($zip)
    {
      $splitter = ($create_zip_name_dir === true) ? "." : "/";
      if ($dest_dir === false) $dest_dir = substr($src_file, 0, strrpos($src_file, $splitter))."/";
      // Create the directories to the destination dir if they don't already exist
      create_dirs($dest_dir);
      // For every file in the zip-packet
      while ($zip_entry = zip_read($zip))
      {
        // Now we're going to create the directories in the destination directories
        // If the file is not in the root dir
        $pos_last_slash = strrpos(zip_entry_name($zip_entry), "/");
        if ($pos_last_slash !== false)
        {
          // Create the directory where the zip-entry should be saved (with a "/" at the end)
          create_dirs($dest_dir.substr(zip_entry_name($zip_entry), 0, $pos_last_slash+1));
        }
        // Open the entry
        if (zip_entry_open($zip,$zip_entry,"r"))
        {
          // The name of the file to save on the disk
          $file_name = $dest_dir.zip_entry_name($zip_entry);
          // Check if the files should be overwritten or not
          if ($overwrite === true || $overwrite === false && !is_file($file_name))
          {
            // Get the content of the zip entry
            $fstream = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
            file_put_contents($file_name, $fstream );
            // Set the rights
            chmod($file_name, 0777);
            echo "save: ".$file_name."<br />";
          }
          // Close the entry
          zip_entry_close($zip_entry);
        }      
      }
      // Close the zip-file
      zip_close($zip);
    }
  }
  else
  {
    return false;
  }
  return true;
}

相关内容

  • 没有找到相关文章

最新更新