为了账号安全,请及时绑定邮箱和手机立即绑定

文件存在但收到无法打开流的警告:没有这样的文件或目录

文件存在但收到无法打开流的警告:没有这样的文件或目录

PHP
白板的微信 2022-10-09 17:24:50
<?php$arch_filename = "myzipx.zip";$dest_dir = "./dest";if (!is_dir($dest_dir)) {    if (!mkdir($dest_dir, 0755, true))        die("failed to make directory $dest_dir\n");}$zip = new ZipArchive;if (!$zip->open($arch_filename))    die("failed to open $arch_filename");for ($i = 0; $i < $zip->numFiles; ++$i) {    $path = $zip->getNameIndex($i);    $ext = pathinfo($path, PATHINFO_EXTENSION);    if (!preg_match('/(?:pdf)/i', $ext))        continue;    $dest_basename = pathinfo($path, PATHINFO_BASENAME);    echo $path, PHP_EOL;    copy("$path", "$dest_dir/{$dest_basename}");}$zip->close();?>发生了一件奇怪的事情,因为这段代码只工作了 15 分钟,现在抛出警告(!)警告:复制(myzipx/x/x.pdf):无法打开流:第 21 行的 C:\wamp64\www\zip_ex\x\zip_img.php 中没有这样的文件或目录但该文件存在并回显正确的文件名。不明白似乎是什么问题..任何帮助表示赞赏。
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

你的尝试copy()是正确的。与ZipArchive::extractTo()(提取并在目标中创建子文件夹)不同,该方法copy()只是将指定文件从存档复制/提取到目标。


这个例子应该工作:


$archive = "testarchive.zip";

$dest_dir = "./dest";

if (!is_dir($dest_dir)) {

    if (!mkdir($dest_dir, 0755, true)) die("failed to make directory $dest_dir\n");

}

$zip = new ZipArchive;

if (!$zip->open($archive)) die("failed to open $archive");


for($i = 0; $i < $zip->numFiles; $i++) {

    $file_name = $zip->getNameIndex($i);

    $file_info = pathinfo($file_name);

    $file_ext = pathinfo($file_name, PATHINFO_EXTENSION);

    if (preg_match('/pdf/i', $file_ext)) {

        copy("zip://".$archive."#".$file_name, $dest_dir.'/'.$file_info['basename']);

    }

}                  

$zip->close();

测试档案结构:


xxxxx@xxxxxx:~/Documents$ tree testarchive

testarchive

└── test

    └── blubb

        └── test.pdf

然后将该文件夹testarchive压缩为testarchive.zip.


运行上面的代码后:


xxxxx@xxxxxx:~/Documents$ tree dest

dest

└── test.pdf


查看完整回答
反对 回复 2022-10-09
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

您需要从 zip 存档中提取。


for ($i = 0; $i < $zip->numFiles; ++$i) {

    $path = $zip->getNameIndex($i);

    $ext = pathinfo($path, PATHINFO_EXTENSION);

    if (preg_match('/pdf/i', $ext)) {

        $dest_basename = pathinfo($path, PATHINFO_BASENAME);

        echo $path, PHP_EOL;

        file_put_contents("$dest/$dest_basename", $zip->getFromIndex($i))

    }

}


查看完整回答
反对 回复 2022-10-09
  • 2 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号