繁体   English   中英

为什么我得到copy()期望参数2是PHP中的有效路径

[英]Why I am getting copy() expects parameter 2 to be a valid path in PHP

我正在尝试将两个名为test1234.txttest2431.txt的文件从一个文件夹复制到另一个文件夹。 我想复制它们并将文件名更改为test1.txttest2.txt 我为此写了一个kode,但是我一直在得到这个错误: Warning: copy() expects parameter 2 to be a valid path, array given in 这是代码:

$src = glob('C:/Users/Carl/Downloads/'.date("ymd").'/test*.txt');
$dest = glob('C:/Users/Carl/Downloads/test*.txt');
    foreach ($src as $value) {
        if(preg_match("([0-9]+)", $value)) {
             $arr = array($value);
             foreach($arr as $arrValue) {
             copy($arrValue, $dest);
        }
    }

我尝试了许多代码,但是我不知道如何消除这种错误。 任何帮助都非常感谢。

glob的结果是一个数组,因此您应该使用一个键来指定一个唯一值:

$src = glob('C:/Users/Carl/Downloads/'.date("ymd").'/test*.txt');
$dest = glob('C:/Users/Carl/Downloads/test*.txt');
    foreach ($src as $value) {
        if(preg_match("([0-9]+)", $value)) {
             $arr = array($value);
             foreach($arr as $key => $arrValue) {
                copy($arrValue, $dest[$key]);  // <= here
             }
        }
    }

如果目标中没有文件,请执行以下操作:

$src = glob('C:/Users/Carl/Downloads/'.date("ymd").'/test*.txt');
$base_dest = 'C:/Users/Carl/Downloads/';
    foreach ($src as $value) {
        if(preg_match("([0-9]+)", $value)) {
             $arr = array($value);
             foreach($arr as $arrValue) {
                $info = pathinfo($arrValue);
                $dest = $base_dest . $info['basename'];
                copy($arrValue, $dest);  // <= here
             }
        }
    }

您的代码有多个问题:

$src = glob('C:/Users/Carl/Downloads/'.date("ymd").'/test*.txt');

我想这第一行是正确的。 它将返回一个这样的数组:

 [ C:/Users/Carl/Downloads/160220/test1.txt, C:/Users/Carl/Downloads/160220/test2.txt, C:/Users/Carl/Downloads/160220/test1234.txt ] 
$dest = glob('C:/Users/Carl/Downloads/test*.txt');

该行的行为类似于上一行。 它将返回一个这样的数组:

 [ C:/Users/Carl/Downloads/test1.txt, C:/Users/Carl/Downloads/test2.txt, C:/Users/Carl/Downloads/test1234.txt ] 

这意味着-如果使用此数组设置目标名称- 该文件将被覆盖 否则,如果Downloads目录中没有诸如test*.txt的文件,则该数组为空,并且无法复制文件。

通过此循环,您可以foreach所有src数组元素的foreach循环:

foreach ($src as $value) {

因此,以下行是完全无用的(您通过具有'160220'的glob检索数组值,因此所有行都匹配[0-9]+模式

    if(preg_match("([0-9]+)", $value)) 
    {

以下几行是无法理解的:为什么将$value分配给数组以执行foreach循环? 只需编写copy( $value, ... )就可以执行以下代码。

换句话说,当$value'C:/Users/Carl/Downloads/160220/test1234.txt' (即)时,数组为[ 'C:/Users/Carl/Downloads/160220/test1234.txt' ]

        $arr = array($value);
             foreach($arr as $arrValue) 
        {
             copy($arrValue, $dest);

最后一行无论如何都会失败,因为$dest是一个数组,并且您不能将目标值设置为数组。 您必须将其设置为有效的路径字符串。

如果要将文件复制到新的目标位置而不覆盖现有文件 ,则必须尝试这种方式:

$src        = glob( 'C:/Users/Carl/Downloads/'.date("ymd").'/test*.txt' );
$destPrefix = 'C:/Users/Carl/Downloads/test';

$i = 1;
foreach( $src as $value )
{
    while( file_exists( "{$destPrefix}{$i}.txt" ) ) $i++;
    copy( $value, "{$destPrefix}{$i}.txt" );
}

通过这种方式,在while循环中,您搜索文件Downloads/test1.txt存在; 如果存在,则将$i加1,然后搜索文件Downloads/test2.txt存在,等等。如果文件名不存在,则可以将源复制到目标。

否则,如果要覆盖现有文件,则可以充当原始代码:

$src  = glob( 'C:/Users/Carl/Downloads/'.date("ymd").'/test*.txt' );
$dest = glob('C:/Users/Carl/Downloads/test*.txt');
foreach( $src as $key => $value )
{
    copy( $value, $dest[$key] );
}

但是,如果$dest中匹配的文件总数少于$src文件,则copy命令将失败。

编辑:

  1. 请注意, copy原始文件不会被删除;
  2. 如果要复制保留其名称的文件,则可以使用以下命令: copy( $value, 'C:/Users/Carl/Downloads/'.basename($value));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM