PHP file_exists但重命名失败“没有这样的文件或目录......”?

时间:2013-01-18 23:39:37

标签: php rename file-exists

有问题的文件创建滞后于有问题的功能,我尝试运行一个while循环来购买一段时间再调用重命名。

$no_file = 1;   
while($no_file && $no_file < 300)
{   // generation of Worksheet.xls may lag behind function -- WAIT FOR IT
    if(file_exists($old_path))
    {   $no_file = 0;
        rename($old_path, $new_path);
    }   else $no_file++;
}
if($no_file) die("Error: Worksheet.xls not found");

在这个配置中,我认为只有在file_exists()返回true时才能调用rename(),但是对于我的生活,我无法弄清楚如何/为什么然后调用rename()然后没有回来......

  

PHP警告:   重命名(C:\ WAMP \ WWW \ demox /可湿性粉剂内容/插件/猫人/店经理/汇总/工作表/ Worksheet.xls,C:\ WAMP \ WWW \ demox /可湿性粉剂内容/插件/ CAT-人/店经理/汇总/报表/测试/ 2012 / Worksheet.xls)   没有这样的文件或目录...

3 个答案:

答案 0 :(得分:10)

它可能告诉你statements/TESTING/2012/不存在。使用mkdir()创建这些目录,以便能够保存文件。

mkdir( 'C:\wamp\www\demox/wp-content/plugins/cat-man/store-manager/summary/statements/TESTING/2012/', 777, true);

答案 1 :(得分:1)

无论远程如何,此代码都会打开竞争条件的可能性,在该条件下,您的文件可以在检查文件存在和尝试重命名之间进行更改。最好立即从try/catch块尝试重命名并直接处理失败。

重命名后,您应该使用break语句显式退出循环。在重命名之前设置$no_file = 0;是过早地庆祝胜利。

另外,如果你是为了延迟而循环,你需要休眠执行,否则循环将以PHP处理它的速度完成。看看time_nanosleep。如果你花时间while循环,你会看到它完成得非常非常快:

$time_start = microtime(true);
$x = 0;
while ($x < 300) {
    file_exists("index.php");
    $x++;
}
echo sprintf("300 loops in %.9f seconds", microtime(true) - $time_start);

// 300 loops in 0.000626087 seconds

答案 2 :(得分:1)

好的,mkdir()确实解决了这个问题!这是上下文中的解决方案。

$old_path = $smry_dir."worksheets/Worksheet.xls";
if(@$store_options->paypal_live ==='false')
{   $new_path = $smry_dir."statements/TESTING/$reporting_year";
}   else $new_path = $smry_dir."statements/$reporting_year";
if(!is_dir($new_path)) mkdir($new_path, 777, true);
rename($old_path, $new_path."/Worksheet.xls");

再次感谢您的帮助! DIR语句总是存在,我发现虽然rename()会编写单个新的子目录$ reporting_year而没有抱怨,但它不会/不能写递归子“TESTING / $ reporting_year”。

mkdir的救援递归参数!