ZipArchive::addEmptyDir

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.8.0)

ZipArchive::addEmptyDir添加一个新目录

描述

public ZipArchive::addEmptyDir(string $dirname, int $flags = 0): bool

在存档中添加一个空目录。

参数

dirname

要添加的目录。

flags

由 **ZipArchive::FL_ENC_GUESS**, **ZipArchive::FL_ENC_UTF_8**, **ZipArchive::FL_ENC_CP437** 构成的位掩码。 这些常量的行为在 ZIP 常量 页面中描述。

返回值

成功时返回 **true**,失败时返回 **false**。

变更日志

版本 描述
8.0.0 / 1.18.0 flags 已添加。

示例

示例 #1 在存档中创建一个新目录

<?php
$zip
= new ZipArchive;
if (
$zip->open('test.zip') === TRUE) {
if(
$zip->addEmptyDir('newDirectory')) {
echo
'Created a new root directory';
} else {
echo
'Could not create the directory';
}
$zip->close();
} else {
echo
'failed';
}
?>
添加笔记

用户贡献的笔记 9 笔记

4
hunter666 at abv dot bg
14 年前
将文件夹和子目录添加到 zip 存档。

<?php
$archive_name
= "archive.zip"; // zip 文件名
$archive_folder = "folder"; // 要存档的文件夹

$zip = new ZipArchive;
if (
$zip -> open($archive_name, ZipArchive::CREATE) === TRUE)
{
$dir = preg_replace('/[\/]{2,}/', '/', $archive_folder."/");

$dirs = array($dir);
while (
count($dirs))
{
$dir = current($dirs);
$zip -> addEmptyDir($dir);

$dh = opendir($dir);
while(
$file = readdir($dh))
{
if (
$file != '.' && $file != '..')
{
if (
is_file($file))
$zip -> addFile($dir.$file, $dir.$file);
elseif (
is_dir($file))
$dirs[] = $dir.$file."/";
}
}
closedir($dh);
array_shift($dirs);
}

$zip -> close();
echo
'Archiving is sucessful!';
}
else
{
echo
'Error, can\'t create a zip file!';
}
?>
1
thomas dot rubbert at yahoo dot de
15 年前
这里有一个基于堆栈的方式来压缩目录。 没有递归,没有函数,没有类

<?php
$zip
= new ZipArchive();
$zip->open('test.zip', ZipArchive::CREATE);

$dirName = 'test';

if (!
is_dir($dirName)) {
throw new
Exception('Directory ' . $dirName . ' does not exist');
}

$dirName = realpath($dirName);
if (
substr($dirName, -1) != '/') {
$dirName.= '/';
}

/*
* NOTE BY danbrown AT php DOT net: A good method of making
* portable code in this case would be usage of the PHP constant
* DIRECTORY_SEPARATOR in place of the '/' (forward slash) above.
*/

$dirStack = array($dirName);
//Find the index where the last dir starts
$cutFrom = strrpos(substr($dirName, 0, -1), '/')+1;

while (!empty(
$dirStack)) {
$currentDir = array_pop($dirStack);
$filesToAdd = array();

$dir = dir($currentDir);
while (
false !== ($node = $dir->read())) {
if ((
$node == '..') || ($node == '.')) {
continue;
}
if (
is_dir($currentDir . $node)) {
array_push($dirStack, $currentDir . $node . '/');
}
if (
is_file($currentDir . $node)) {
$filesToAdd[] = $node;
}
}

$localDir = substr($currentDir, $cutFrom);
$zip->addEmptyDir($localDir);

foreach (
$filesToAdd as $file) {
$zip->addFile($currentDir . $file, $localDir . $file);
}
}

$zip->close();
?>
1
lea dot gris at noiraude dot net
3 个月前
方法 <code>addEmptyDir</code> 不会处理权限位和目录 <code>mtime</code>。这些需要在目录在 Zip 档案中创建后单独设置。

请注意,设置 <code>mtime</code> 仅在 PHP >= 8.0 版本后可用,因此在 PHP 7.4 及更低版本中,它将保留 <code>addEmptyDir</code> 调用的当前时间戳。

以下是一个用于修复 Zip 档案中目录的权限和 <code>mtime</code> 的函数。

<pre><code lang="php">
function fixDirAttributes(ZipArchive $zip, string $path, string $name)
{
// 获取目录在 Zip 档案中的索引
$indexInZip = $zip->locateName('/' === mb_substr($name, -1) ? $name : $name . '/');
if (false !== $indexInZip) { // 找到名称
if (method_exists($zip, 'setMtimeIndex')) { // PHP >= 8.0.0, PECL zip >= 1.16.0
$zip->setMtimeIndex($indexInZip, filemtime($path)); // 修复目录的 mtime
}
$filePerms = fileperms($path); // 获取目录的权限
if (false !== $filePerms) { // filePerms 受支持
$attr = $filePerms << 16; // 左移权限以获取外部属性值
$zip->setExternalAttributesIndex($indexInZip, \ZipArchive::OPSYS_UNIX, $attr);
}
}
}
</pre></code>
0
iunknownvb at gmail dot com
1 年前
我修改了 thomas dot rubbert at yahoo dot de 的代码

$uploads_dir =storage_path().'/app/public/files/' ;
if(!file_exists($uploads_dir)){
mkdir($uploads_dir,0777,true);
}
$zip_file=$uploads_dir.'download.zip';
if(file_exists($zip_file)){
unlink($zip_file);
}
$zip = new \ZipArchive();
if (!$zip->open($zip_file, \ZIPARCHIVE::CREATE)) {
http_response_code(501);
echo 'Zip creation failed';
die();
}
$img=$uploads_dir.'img';

$dirName = realpath($img);
if (substr($dirName, -1) != DIRECTORY_SEPARATOR) {
$dirName.= DIRECTORY_SEPARATOR;
}
$dirStack = array($dirName);
//Find the index where the last dir starts
$cutFrom = strrpos(substr($dirName, 0, -1), DIRECTORY_SEPARATOR)+1;
while (!empty($dirStack)) {
$currentDir = array_pop($dirStack);
$filesToAdd = array();
$dir = dir($currentDir);
while (false !== ($node = $dir->read())) {
if (($node == '..') || ($node == '.')) {
continue;
}
if (is_dir($currentDir . $node)) {
array_push($dirStack, $currentDir . $node . DIRECTORY_SEPARATOR);
}
if (is_file($currentDir . $node)) {
$filesToAdd[] = $node;
}
}
$localDir =str_replace(DIRECTORY_SEPARATOR,'/',substr($currentDir, $cutFrom));
$zip->addEmptyDir($localDir);
foreach ($filesToAdd as $file) {
$zip->addFile($currentDir . $file, $localDir . $file);
}
}
// any additional files
$db=$uploads_dir.'databse.db';
//$zip->addFromString(basename($db), file_get_contents($db));
$zip->addFile($db, basename($db));
$zip->close();
0
pagetronic
15 年前
addEmptyDir 现在不存在,
使用 $zip->addFile($file, $dir.$fichier);

网上没有关于此内容的信息,

addEmptyDir 在 Ubuntu 上有效,但在 Debian Etch 上无效
0
benjamin dot seiller at antwerpes dot de
16 年前
方法中存在一个错误
ZipArchive::addFile
它影响了下面的 ZipFolder 类。
这与操作系统的最大文件句柄数量有关。

作为解决方法,请在类中添加一个文件计数器,并在达到一定数量的文件(目录计为文件!)时关闭并重新打开档案。

更多详细信息请参见此处
http://de.php.net/manual/en/function.ziparchive-addfile.php
或直接访问此处
http://bugs.php.net/bug.php?id=40494
或此处
http://pecl.php.net/bugs/bug.php?id=9443
-1
tahazit dot co dot il at gmail dot com
9 年前
在 PHP >5.4 中,此函数将创建一个文件,而不是目录。

例如

$zip->addEmptyDir ( 'path/to/dir/' );

将在后者的 "path/" 和 "path/to/" 文件夹中创建一个名为 "dir" 的虚拟 0 字节文件。
如果我们随后将文件添加到该目录,例如这样

$zip->addFromString ( 'path/to/dir/file.txt', $data );

结果将是在虚拟 "dir" 文件旁边创建一个名为 "dir" 的单独文件夹。 "dir" 文件夹将包含 "file.txt" 文件。

这在运行 PHP 5.4 的 APACHE 服务器上进行了测试
-2
D.Jann
15 年前
我稍微修改了 dayjo 的代码,这样它就不会在 zip 文件中重新创建工作驱动器的整个结构

<?php
// 函数用于递归地将目录、
// 子目录和文件添加到 zip 档案中
function addFolderToZip($dir, $zipArchive, $zipdir = ''){
if (
is_dir($dir)) {
if (
$dh = opendir($dir)) {

// 添加目录
if(!empty($zipdir)) $zipArchive->addEmptyDir($zipdir);

// 循环遍历所有文件
while (($file = readdir($dh)) !== false) {

// 如果是文件夹,则再次运行函数!
if(!is_file($dir . $file)){
// 跳过父目录和根目录
if( ($file !== ".") && ($file !== "..")){
addFolderToZip($dir . $file . "/", $zipArchive, $zipdir . $file . "/");
}

}else{
// 添加文件
$zipArchive->addFile($dir . $file, $zipdir . $file);

}
}
}
}
}
?>

如果您没有指定第三个参数(zipdir),则您添加的目录将被添加到 zip 文件的根目录。

D.Jann
-3
Anonymous
15 年前
这是一个简单的递归函数,用于将目录、所有子目录和所有文件添加到已创建的 zip 文件中;

<?php
// 函数递归地将目录、
// 子目录和文件添加到 zip 档案中
function addFolderToZip($dir, $zipArchive){
if (
is_dir($dir)) {
if (
$dh = opendir($dir)) {

// 添加目录
$zipArchive->addEmptyDir($dir);

// 循环遍历所有文件
while (($file = readdir($dh)) !== false) {

// 如果是文件夹,再次运行函数!
if(!is_file($dir . $file)){
// 跳过父目录和根目录
if( ($file !== ".") && ($file !== "..")){
addFolderToZip($dir . $file . "/", $zipArchive);
}

}else{
// 添加文件
$zipArchive->addFile($dir . $file);

}
}
}
}
}
?>

希望能看到更多关于这些函数的输入 :)

Dayjo
To Top