Неожиданное поведение PHP-функции rename (), используемой в моем коде для переименования файлов

Мой код удаляет файл и переименовывает некоторые файлы, включая имя удаленного файла, в другой файл. Но этот код работает неожиданно. В чем проблема … Или что не так в моем коде …

отредактированный

5 файлов

file1.jpg,file2,jpg,file3.jpg,file4.jpg,file5.jpg

$target = 2; //target file to delete
$total = 5; //total files

$name = 'file';
unlink($name.$target.".jpg");//deleting
usleep(10000000);//to find deleted or not afterdelete
for($i = $target+1;$i<=$total;$i++)
{
rename($name.$i.".jpg" , $name.($i-1).".jpg");
}

Мои ожидания

file2 have to be deleted , then

file3.jpg rename to file2.jpg
file4.jpg rename to file3.jpg
file5.jpg rename to file4.jpg

Но результат не тот, который я ожидал.

Результат

- file2.jpg deleted.correctly.("I am sure i put usleep() after unlink(),the image deleted")
- file3.jpg renamed to file2.jpg but the file3 content has file2.jpg content
- file4.jpg renamed to file3.jpg
- file5.jpg renamed to file4.jpg

иногда это работает, как я ожидал, но иногда нет,

-file3 renamed to file2
-file4 renamed to file3
-file5 renamed to file4 but have file3 content

Каждый раз работает неожиданно и по другому

Первоначально

введите описание изображения здесь

После удаления между Usleep ()

введите описание изображения здесь

Конечный результат

введите описание изображения здесь

Я действительно не понимаю, что происходит с моим кодом. Пожалуйста, кто-нибудь, помогите мне ..

0

Решение

Мое предложение; кешировать имена файлов:

$file1 = "var/www/magento/media/file1";
$file2 = "var/www/magento/media/file2";
$unresult = unlink($file1);
$reresult = rename($file2, $file1);

P.S: Код работает просто отлично, (я даже проверял это !!); но взгляните на следующее:

<?php
$file1 = "file1.txt";
$file2 = "file2.txt";

// insert some contents into each file
file_put_contents($file1, "AAAA");
file_put_contents($file2, "BBBB");

// delete the first file, and then rename the second one to "file1"$unresult = unlink($file1);
$reresult = rename($file2, $file1);

// now that the file is renamed, then there should be "BBBB" in the file named "file1.txt"echo file_get_contents($file1); // Outputs: BBBB
?>
0

Другие решения

Ваш код является функционально корректным, и я подозреваю, что «обновление файловой системы» является источником проблемы, однако, как вы уже сказали, проблема возникает иногда.

Кажется, что в PHP нет встроенной функции «обновления файловой системы», однако, следующее — это всего лишь обходной путь, но он сделает свое дело:
Что касается «обновления», то после процесса переименования просто создайте временный пустой файл, а затем удалите его! Во всех моих тестах (я также проверял это в Windows) это «иногда» наречие менялось на «никогда»!

файлы file_1.png, file_2.png, file_3.png, file_4.png, file_5.pngс их числовыми суффиксами в качестве содержимого файлов.

<?php
$target = 2; //target file to delete
$total  = 5; //total files

$name = 'file_';
$fileToDelete = "$name$target.png";
unlink($fileToDelete); //delete
echo "Deleted: $fileToDelete<br/>";

for($i = $target+1; $i<=$total; $i++)
{
$prev = $i-1;
$from = "$name$i.png";
$to   = "$name$prev.png";

rename($from , $to);
echo "file renamed: [$from -> $to]<br/>";
}
// refresh the file system!!
file_put_contents("tmp","");
unlink("tmp");
?>

Выход:

Deleted: file_2.png
file renamed: [file_3.png -> file_2.png]
file renamed: [file_4.png -> file_3.png]
file renamed: [file_5.png -> file_4.png]

история через картинки:

процедура через изображение

0

По вопросам рекламы [email protected]