Файл существует, но появляется предупреждение о невозможности открыть поток: нет такого файла или каталога - PullRequest
0 голосов
/ 25 февраля 2020
<?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): не удалось открыть поток : Нет такого файла или каталога в C: \ wamp64 \ www\zip_ex \ x \ zip_img. php в строке 21

Но файл существует и отображает правильное имя файла. Не понимаю, в чем проблема ... Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Ваша попытка с 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();

Структура Testarchiv:

xxxxx@xxxxxx:~/Documents$ tree testarchive
testarchive
└── test
    └── blubb
        └── test.pdf

Папка testarchive затем сжимается до testarchive.zip.

После выполнения кода выше:

xxxxx@xxxxxx:~/Documents$ tree dest
dest
└── test.pdf

0 голосов
/ 25 февраля 2020

Вам нужно извлечь из 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))
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...