Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PharData extractTo方法引发异常,消息为“0”;“路径已存在”;_Php - Fatal编程技术网

Php PharData extractTo方法引发异常,消息为“0”;“路径已存在”;

Php PharData extractTo方法引发异常,消息为“0”;“路径已存在”;,php,Php,我使用PHP的PharData类从tar归档文件中提取文件,但我看到一个非常奇怪的行为。以下是我正在使用的代码: $filePattern = "$homeDirectory/*tgz"; $fileArray = glob($filePattern); $i = 0; foreach($fileArray as $file) { $phar = new PharData($file); $phar->extractTo($homeDirectory."/logs-$i");

我使用PHP的PharData类从tar归档文件中提取文件,但我看到一个非常奇怪的行为。以下是我正在使用的代码:

$filePattern = "$homeDirectory/*tgz";
$fileArray = glob($filePattern);
$i = 0;

foreach($fileArray as $file) {
  $phar = new PharData($file);
  $phar->extractTo($homeDirectory."/logs-$i");
  array_push($extractedDirectories, $homeDirectory."/logs-$i");
  $i++;
}
foreach循环应该提取主目录中的每个归档文件,并将它们移动到名为“logs-n”的目录中,其中n是主目录下包含0的整数。然而,我得到一个例外声明:

 Encountered error: exception 'PharException' with message 'Extraction from phar "/home/user/file.tgz" failed: Cannot extract "output" to "/home/user/logs-0/output", path already exists'
我的第一个想法是归档文件包含两个“输出”目录,因此我手动提取归档文件并检查内容;瞧,只有一个输出目录。我想到的另一个想法是,循环可能会尝试对同一个归档运行两次,但在这两种情况下都没有发生

重申,在循环开始处理特定的tar归档文件之前,目录“logs-n”不存在。然后它抛出一个异常,表示提取它的路径已经存在


我开始认为我在PharData类或extractTo方法方面遇到了某种限制,但是php.net上的文档都没有涉及到类似的内容,因此我也没有发现任何涉及此类内容的问题,这就是为什么我要添加此项的原因。

好吧,在我的头撞了一下之后。问题是我没有使用extractTo方法的全套参数。该方法接受一个必需参数和两个可选参数,第一个可选参数是包含要提取的特定文件名的字符串或数组,第二个可选参数是“覆盖”标志。当我将代码更改为以下内容时:

foreach($fileArray as $file) {
  $phar = new PharData($file);
  $phar->extractTo($homeDirectory."/logs-$i", null, true);
  array_push($extractedDirectories, $homeDirectory."/logs-$i");
  $i++;
}
在这里,我只是要求提取所有文件,并允许覆盖。一旦我这样做了,问题就解决了。如果您阅读此方法的,则会显示此标志决定是否覆盖现有文件。我真的不知道为什么要这样做才能起作用。对于这种情况发生的原因,我能找到的最接近的解释是,出于某种原因,extractTo方法在对子日志文件进行第一次迭代后,看到父“output”目录已经存在,但失败了