2011-07-27 74 views
2

有没有办法让我在继续执行php循环之前检查文件是否被复制?等待复制()完成

我有一个for循环,并在循环内它将要复制一个文件。现在,我想让它在继续循环之前一直等到当前文件被复制。

例如:

for ($i = 1; $i <= 10; $i++) 
{ 
$temp = $_FILES['tmp_name']; 
$extension = '.jpg'; 

copy("$temp_$i_$extension", "$local_$i_$extension"); 

// not sure what to do here 

if (FILE_DONE_COPYING()) 
{ 
    CONTINUE_LOOP(); 
} 
else 
{ 
    PAUSE_LOOP(); 
} 
} 

那只是一个例子。我不知道如何做到这一点......任何人都可以参加?

+3

的绝大部分功能阻止,直到完成。 'copy()'可能就是其中之一。这意味着一旦copy()返回,文件被完全复制。 –

回答

12

这就是复制()不会在PHP - 直到文件被复制它的块。除了检查返回值以查看操作是否成功之外,您无需执行任何操作。

+0

不知道。非常感谢! – scarhand

+0

我会添加$ .02,某些网络文件系统(即GlusterFS)似乎打破了这一点。在某些情况下,如果我从临时目录复制到网络共享,然后立即删除只有部分文件到目的地的临时版本,尽管copy()返回TRUE。 –

2

PHP由步线把它用线,一步,所以它的等待,直到copy()完成

for ($i = 1; $i <= 10; $i++) 
{ 
    $temp = $_FILES['tmp_name']; 
    $extension = '.jpg'; 

    $result = copy("$temp_$i_$extension", "$local_$i_$extension"); 

    if($result){ 
     //done 
    } 
    else{ 
     //failed 
    } 
} 
1

副本在成功时返回true,在失败时返回false。检查一下。

0

是什么让你认为copy()会在它完成之前返回?

您当然可以比较原始文件的文件大小并复制以确保过程完成。

1

除非您经历了使用线程和异步复制触发的麻烦,否则PHP将不会在复制之后移动到行,直到它完成为止。

0

您可以使用while循环调用sleep来延迟检查,并且只要文件以新名称存在就退出while循环。

1

copy在继续执行之前确实等待完成。这是一个同步通话。但是,如果它不起作用,它可能会返回false,并且由于$temp_$i_不是定义变量,因此您的副本不会工作。所以也许你认为副本没有完成,但实际上根本没有工作。

你应该使用:

copy("{$temp}_{$i}_$extension", "{$local}_{$i}_$extension"); 

OR

copy($temp.'_'.$i.'_'.$extension, $local.'_'.$i.'_'.$extension);