为什么我得到 copy() 期望参数 2 是 PHP 中的有效路径
Why I am getting copy() expects parameter 2 to be a valid path in PHP
我正在尝试将名称为 test1234.txt
和 test2431.txt
的两个文件从一个文件夹复制到另一个文件夹。我想复制它们并将文件名更改为 test1.txt
和 test2.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');
我想第一行是正确的。它将 return 一个像这样的数组:
[
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');
这一行和上一行一样。它将 return 一个像这样的数组:
[
C:/Users/Carl/Downloads/test1.txt,
C:/Users/Carl/Downloads/test2.txt,
C:/Users/Carl/Downloads/test1234.txt
]
这意味着 — 如果您使用此数组设置目标名称 — 此文件将被覆盖。
否则,如果Downloads目录下没有test*.txt
这样的文件,则数组为空,无法复制文件。
通过此循环,您可以对所有 src
个数组元素执行 foreach
循环:
foreach ($src as $value) {
因此,下一行完全没用(您通过 glob
和 '160220' 检索数组值,因此 所有行都匹配 [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
命令将失败。
编辑:
- 请注意,
copy
您的原始文件不会被删除;
- 如果你想复制文件保留他们的名字你可以使用这个命令:
copy( $value, 'C:/Users/Carl/Downloads/'.basename($value));
我正在尝试将名称为 test1234.txt
和 test2431.txt
的两个文件从一个文件夹复制到另一个文件夹。我想复制它们并将文件名更改为 test1.txt
和 test2.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');
我想第一行是正确的。它将 return 一个像这样的数组:
[ 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');
这一行和上一行一样。它将 return 一个像这样的数组:
[ C:/Users/Carl/Downloads/test1.txt, C:/Users/Carl/Downloads/test2.txt, C:/Users/Carl/Downloads/test1234.txt ]
这意味着 — 如果您使用此数组设置目标名称 — 此文件将被覆盖。
否则,如果Downloads目录下没有test*.txt
这样的文件,则数组为空,无法复制文件。
通过此循环,您可以对所有 src
个数组元素执行 foreach
循环:
foreach ($src as $value) {
因此,下一行完全没用(您通过 glob
和 '160220' 检索数组值,因此 所有行都匹配 [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
命令将失败。
编辑:
- 请注意,
copy
您的原始文件不会被删除; - 如果你想复制文件保留他们的名字你可以使用这个命令:
copy( $value, 'C:/Users/Carl/Downloads/'.basename($value));