Php 文件存在,但收到打开流失败的警告:没有这样的文件或目录

Php 文件存在,但收到打开流失败的警告:没有这样的文件或目录,php,copy,zip,Php,Copy,Zip,一件奇怪的事情发生了,因为这个代码只工作了15分钟,现在发出警告 (!)警告:复制(myzipx/x/x.pdf):无法打开流:第21行的C:\wamp64\www\zip\u ex\x\zip\u img.php中没有此类文件或目录 但该文件存在,并回显正确的文件名。我不明白是什么问题。。感谢您的帮助 您需要从zip存档中提取 <?php $arch_filename = "myzipx.zip"; $dest_dir = "./dest"; if (!is_dir($dest_dir)

一件奇怪的事情发生了,因为这个代码只工作了15分钟,现在发出警告

(!)警告:复制(myzipx/x/x.pdf):无法打开流:第21行的C:\wamp64\www\zip\u ex\x\zip\u img.php中没有此类文件或目录


但该文件存在,并回显正确的文件名。我不明白是什么问题。。感谢您的帮助

您需要从zip存档中提取

<?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();
?>
for($i=0;$i<$zip->numFiles;++$i){
$path=$zip->getNameIndex($i);
$ext=pathinfo($path,pathinfo_扩展名);
if(预匹配('/pdf/i',$ext)){
$dest\u basename=pathinfo($path,pathinfo\u basename);
echo$path,PHP_EOL;
文件内容($dest/$dest\u basename),$zip->getFromIndex($i))
}
}
您尝试使用
copy()
是正确的。 与
ZipArchive::extractTo()
(它还提取并创建目标中的子文件夹)不同,方法
copy()
只需将指定的文件从存档复制/提取到目标

这个例子应该适用于:

$archive=“testarchive.zip”;
$dest_dir=“/dest”;
如果(!is_dir($dest_dir)){
如果(!mkdir($dest_dir,0755,true))死亡(“未能生成目录$dest_dir\n”);
}
$zip=新的ZipArchive;
如果(!$zip->open($archive))死亡(“未能打开$archive”);
对于($i=0;$i<$zip->numFiles;$i++){
$file\u name=$zip->getNameIndex($i);
$file\u info=pathinfo($file\u name);
$file\u ext=pathinfo($file\u name,pathinfo\u扩展名);
if(preg_match('/pdf/i',$file_ext)){
复制(“zip://”。$archive。”#“$file_name,$dest_dir.//”。$file_info['basename']);
}
}                  
$zip->close();
测试结构:

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))
    }
}
然后将文件夹
testarchive
压缩为
testarchive.zip

运行上述代码后:

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

$path
是ZIP存档中的文件名,而不是计算机上的文件名。我的ZIP文件夹也有子文件夹。。我只想提取文件,而不是使用子文件夹
PATHINFO\u BASENAME
只获取文件名,而不使用文件夹。情况有所不同。它以x1.pdf(文件夹不是文件)的形式给出输出,然后在解压的zip文件夹中包含包含文件的子文件夹。它应该将
x1.pdf
解压到
$dest_dir/x1.pdf
中。否,它将x1.pdf解压为包含整个zip文件夹以及包含文件的子文件夹的文件夹
xxxxx@xxxxxx:~/Documents$ tree dest
dest
└── test.pdf