2011-07-27 95 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);