PHP 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");

В этой конфигурации я думаю, что rename() может быть вызван, только если file_exists() возвращает true, но я не могу понять, как / почему вызывается rename(), а затем не возвращается...

Предупреждение PHP: переименуйте (C:\wamp\www\demox/wp-content/plugins/cat-man/store-manager/summary/worksheets/Worksheet.xls,C:\wamp\www\demox/wp-content/plugins/cat-man/store-manager/summary/statements/TESTING/2012/Worksheet.xls) Нет такого файла или каталога...

3 ответа

Решение

Это, вероятно, говорит вам statements/TESTING/2012/ не существует Создайте эти каталоги с mkdir() поэтому он сможет сохранить файл.

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

Несмотря на удаленность, этот код открывает возможность состязания, когда ваш файл может измениться между проверкой его существования и попыткой переименовать его. Лучше попытаться переименовать сразу из 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

Хорошо, 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() будет писать единственный новый подкаталог $reports_year без жалоб, он не будет / не может писать рекурсивные подпрограммы "TESTING/$reports_year".

Рекурсивный параметр mkdir на помощь!

Другие вопросы по тегам