2011-12-19 131 views
0

我有一个PHP脚本,用于将文件移出服务器上的特定文件夹(IBM AS400)。我遇到的问题是,有时脚本在文件仍在移动到文件夹的过程中运行。让PHP等到一个文件完成传输后再传输

我的错误逻辑假设如果一个文件“正在使用”PHP不会尝试移动它,但它会导致文件损坏。

我想我能做到这一点:

$oldModifyTime = filemtime('thefile.pdf'); 
sleep(2); 
if($oldModifyTime === filemtime('thefile.pdf'){ 
    rename('thefile.pdf','/folder2/thefile.pdf'); 
} 

但filemtime功能拿出即使文件被写入相同的值。我也尝试过使用fileatime获得相同的结果。

如果我在Windows中执行右键单击 - >属性,则修改日期和访问日期会随着文件的写入而不断变化。

任何想法如何确定文件是否完成传输之前做任何事情呢?

回答

1

从PHP手册条目filemtime()

注:这个函数的结果会被缓存。有关更多详细信息,请参见clearstatcache()


我也将表明2秒是有点短,以检测文件传输是否完成由于网络拥塞,缓冲等

1

将其作为临时名称或传输到其他文件夹,然后在传输完成后将其重命名/复制到正确的文件夹。

+0

初始文件是从终端用户保存文件来进入文件夹,所以我不能自动“重命名/复制到正确的文件夹”,而无需在服务器端执行并遇到同样的问题。 – Mike 2011-12-19 18:20:54

+0

这真的是最好的解决方案。如果是手动过程,则可能需要教育用户并调整脚本。例如,您可以忽略以.tmp结尾的所有文件,并指示您的用户使用.tmp上传,然后在上传后重命名。 – 2011-12-19 18:28:39

+0

如果即使这是不可能的,那么看看这个问题:http://stackoverflow.com/q/4693168/608781 – 2011-12-19 18:29:00