1

圧縮には以下を使用します

//http://ninad.pundaliks.in/blog/2011/05/recursively-zip-a-directory-with-php/

class FlxZipArchive extends ZipArchive {

    public function addDir($location, $name) {
        $this->addEmptyDir($name);     
        $this->addDirDo($location, $name);
     } // EO addDir

    private function addDirDo($location, $name) {
        $name .= '/';
        $location .= '/';

        // Read all Files in Dir
        $dir = opendir ($location);
        while ($file = readdir($dir))
        {
            if ($file == '.' || $file == '..') continue;

            // Rekursiv, If dir: FlxZipArchive::addDir(), else ::File();
            $do = (filetype( $location . $file) == 'dir') ? 'addDir' : 'addFile';
            $this->$do($location . $file, $name . $file);
        }
    } // EO addDirDo();
}


function zipIt($source, $target){
  $za = new FlxZipArchive;

  $res = $za->open($target, ZipArchive::CREATE);

  if($res === TRUE) {
      $za->addDir($source, basename($source));
      $za->close();
  }
  else
      echo 'Could not create a zip archive';

}

$the_folder = './Sales report';
$zip_file_name = './Sales report.docx';
//Don't forget to remove the trailing slash in folder
zipIt($the_folder,$zip_file_name,false);

問題は、現在のディレクトリが含まれていることです。

Sales report/
    file1.html
    file2.html
    Sub_Dir/
        file19.html

でも欲しいだけ

    file1.html
    file2.html
    Sub_Dir/
        file19.html

どうやってするか?

4

2 に答える 2

1

これが私が使用するものです:

/**
 * Add a directory and its contents to the archive
 *
 * @param string $dir       The local filesystem path to the directory
 * @param string $localName The archive filesystem path to the directory
 *
 * @throws \RuntimeException When adding an object to the archive fails
 */
public function addDir($dirPath, $localName = NULL)
{
    if ($localName === NULL) {
        $localName = basename($dirPath);
    }
    if (!$this->addEmptyDir($localName)) {
        throw new \RuntimeException('Error adding directory '.$dirPath.' to archive');
    }

    $this->addDirContents($dirPath, $localName);
}

/**
 * Add the contents of a directory to the archive
 *
 * @param string $dir       The local filesystem path to the directory
 * @param string $localName The archive filesystem path to the directory
 *
 * @throws \RuntimeException When adding an object to the archive fails
 */
public function addDirContents($dirPath, $localName = '')
{
    $base = ltrim($localName.'/', '/');

    foreach (glob("$dirPath/*") as $file) {
        if (is_dir($file)) {
            $this->addDir($file, $base.basename($file));
        } else {
            if (!$this->addFile($file, $base.basename($file))) {
                throw new \RuntimeException('Error adding file '.$file.' to archive');
            }
        }
    }
}

コードと同様に、これらのメソッドは を拡張するクラスに属します\ZipArchiveaddDir()ディレクトリとaddDirContents()その内容を追加します。アーカイブに親ディレクトリを作成せずに内容を追加するだけです(したがって、必要なことを行います)。

私は通常、説明なしで無料で動作するコードを配布するのは好きではありませんが、たまたま、エディターで必要なものをすでに開いている場合があります。

于 2013-03-20T10:35:07.797 に答える
0

最後に、このコードを使用して、現在のディレクトリを含めるかどうかを選択するオプションを提供します。

<?php
//http://ninad.pundaliks.in/blog/2011/05/recursively-zip-a-directory-with-php/



class FlxZipArchive extends ZipArchive {

    public function addDir1($location, $name, $includeCurrDir) {
      if($includeCurrDir)
        $this->addEmptyDir($name);     
        $this->addDirDo1($location, $name, $includeCurrDir);
     } // EO addDir

    private function addDirDo1($location, $name, $includeCurrDir) {
      if($includeCurrDir)
        $name .= '/';
      else
        $name = '';

      $location .= '/';

        // Read all Files in Dir
        $dir = opendir ($location);
        while ($file = readdir($dir))
        {
            if ($file == '.' || $file == '..') continue;

            // Rekursiv, If dir: FlxZipArchive::addDir(), else ::File();
            $do = (filetype( $location . $file) == 'dir') ? 'addDir' : 'addFile';
            $this->$do($location . $file, $name . $file);
        }
    } // EO addDirDo();

    public function addDir($location, $name) {
        $this->addEmptyDir($name);     
        $this->addDirDo($location, $name);
     } // EO addDir

    private function addDirDo($location, $name) {
        $name .= '/';
        $location .= '/';

        // Read all Files in Dir
        $dir = opendir ($location);
        while ($file = readdir($dir))
        {
            if ($file == '.' || $file == '..') continue;

            // Rekursiv, If dir: FlxZipArchive::addDir(), else ::File();
            $do = (filetype( $location . $file) == 'dir') ? 'addDir' : 'addFile';
            $this->$do($location . $file, $name . $file);
        }
    } // EO addDirDo();
}


function zipIt($source, $target, $includeCurrDir){
  $za = new FlxZipArchive;

  $res = $za->open($target, ZipArchive::CREATE);

  if($res === TRUE) {
      $za->addDir1($source, basename($source),$includeCurrDir);
      $za->close();
  }
  else
      echo 'Could not create a zip archive';

}
$the_folder = 'Sales report';
$zip_file_name = 'Sales report.docx';
//Don't forget to remove the trailing slash in folder
zipIt($the_folder,$zip_file_name,false);


?>
于 2013-03-20T11:18:58.103 に答える