显而易见的解决方案是调用
file_exists来检查文件是否存在,但这样做可能会导致竞争条件.当您调用
file_exists和调用
copy时,总是有可能在其间创建另一个文件.检查文件是否存在的唯一安全方法是使用
fopen.
拨打fopen时,将模式设为“x”.这告诉fopen创建文件,但前提是它不存在.如果存在,fopen将失败,您将知道无法创建该文件.如果成功,您将在目的地创建一个可以安全复制的文件.示例代码如下:
// The PHP copy function blindly copies over existing files. We don't wish // this to happen,so we have to perform the copy a bit differently. The // only safe way to ensure we don't overwrite an existing file is to call // fopen in create-only mode (mode 'x'). If it succeeds,the file did not // exist before,and we've successfully created it,meaning we own the // file. After that,we can safely copy over our own file. $filename = 'sourcefile.txt' $copyname = 'sourcefile_copy.txt' if ($file = @fopen($copyname,'x')) { // We've successfully created a file,so it's ours. We'll close // our handle. if (!@fclose($file)) { // There was some problem with our file handle. return false; } // Now we copy over the file we created. if (!@copy($filename,$copyname)) { // The copy Failed,even though we own the file,so we'll clean // up by itrying to remove the file and report failure. unlink($copyname); return false; } return true; }