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

0

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

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

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

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

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

Изображение 174551

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

Изображение 174551

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

Изображение 174551

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

Теги:
file
file-rename

2 ответа

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]

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

Изображение 174551

  • 0
    Спасибо за ваши усилия. Но это не будет работать. Потому что проблема с unlink (), он только удаляет ссылку на файл, не удаляя файл.
0

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

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

PS: Код работает нормально, (я даже проверял его!); но взгляните на следующее:

<?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
    Как вы можете сказать, что это работает .. Та же проблема для этого кода.
  • 0
    @balaraman Сообщение было отредактировано, чтобы пролить больше света ..
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню