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 на помощь!