加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – 在压缩文件中没有父文件夹的文件夹中压缩文件

发布时间:2021-08-28 03:47:58 所属栏目:大数据 来源: https://www.jb51.cc
导读:这对大多数人来说可能是一个愚蠢的问题,但我有以下文件夹,我想要压缩. FolderI Folder1 Folder2 Folder3 .. .. FolderN 现在,将FolderI压缩成zipFile.zip非常简单,因为有很多在线资源,特别是在这里!但是,我想创建zipFile.zip,包含Folder1 … FolderN,这样当

这对大多数人来说可能是一个愚蠢的问题,但我有以下文件夹,我想要压缩.

FolderI
   Folder1
   Folder2
   Folder3
   ..
   ..
   FolderN

现在,将FolderI压缩成zipFile.zip非常简单,因为有很多在线资源,特别是在这里!但是,我想创建zipFile.zip,包含Folder1 … FolderN,这样当文件解压缩时,它会直接用Folder1 … FolderN填充当前目录,而不是创建FolderI,它有Folder1 … FolderN在里面.

我一直在尝试的一些事情是:

$zip = new ZipArchive();

// open archive 
if ($zip->open('my-archive.zip', ZIPARCHIVE::CREATE) !== TRUE) {
    die ("Could not open archive");
}

// initialize an iterator
// pass it the directory to be processed
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("FolderI/"));

// iterate over the directory
// add each file found to the archive
foreach ($iterator as $key=>$value) {
    $zip->addFile(realpath($key), $key) or die ("ERROR: Could not add file: $key");
}

// close and save archive
$zip->close();

这是从compress/archive folder using php script开始的,我试图改变它.虽然没有工作 – FolderI仍然是压缩的.但是,当我解压缩my-archive.zip时,我得到一个FolderI,然后是Folder1..FolderN.我也在这里看到了来自@Alix的代码,它做了同样的事情.但是,并没有真正效仿.

任何形式的帮助都会很棒.如果不是代码,至少指向正确的方向.

谢谢

****这里有人知道怎么做吗? ****

@Mods和Admins:解决方案是否过于简单,或者PHP根本无法做到这一点?

解决方法:

这里出现的问题是迭代器中的$key是完整路径(因为默认使用RecursiveDirectoryIterator :: KEY_AS_PATHNAME标志),其中包括RecursiveDirectoryIterator构造函数中指定的相对部分.

例如,我们有以下层次结构:

folderI
├─ folder1
│  ├─ item.PHP
│  └─ so.PHP
└─ folder2
   └─ item.html

并使用新的RecursiveDirectoryIterator(“folderI”)创建一个迭代器.

当您回显$key时,您将获得item.PHP的以下内容

folderI/folder1/item.PHP

同样,如果我们做了新的RecursiveDirectoryIterator(“../ somewhere / folderI”),那么$key看起来像:

../somewhere/folderI/folder1/item.PHP

您希望获取文件的路径,而不包括用于创建迭代器的路径.值得庆幸的是,RecursiveDirectoryIterator有一个方法,其唯一目的就是做到这一点.

RecursiveDirectoryIterator :: getSubPathname()

您可以使用以下更容易的方法

$newKey = $iterator->getSubPathname();

对于item.PHP,这将返回以下内容,给定上面显示的相同文件夹结构:

folder1/item.PHP

该方法可以像这样使用:

foreach ($iterator as $key=>$value) {
    $zip->addFile(realpath($key), $iterator->getSubPathname()) or die ("ERROR: Could not add file: $key");
}

另外:我们可以在这里使用$iterator-> getSubPathname(),因为RecursiveIteratorIterator将对未知方法的任何调用传递给“内部迭代器”,在本例中是RecursiveDirectoryIterator.同样,你可以做$iterator-> getInnerIterator() – > getSubPathname(),两者都做同样的工作.

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读