Не удаляет файл при архивировании в zip

S
На сайте с 29.12.2008
Offline
43
774

У меня PHP версии 5.2.1

Код-1


$zip = new ZipArchive();
if ($zip->open("image.zip", ZIPARCHIVE::CREATE) !== true) {
fwrite(STDERR, "Error while creating archive file");
exit(1);
}
$zip->addFile("test.jpg", "test.jpg");
unlink ("test.jpg");
$zip->close();

Выдаёт

Warning: unlink(test.jpg) [function.unlink]: Permission denied in D:\INSTALL\PHP\Apache\htdocs\zip\zip.php

Done

Не удаляет файл test.jpg

------------------------------------

Код-2


$zip = new ZipArchive();
if ($zip->open("image.zip", ZIPARCHIVE::CREATE) !== true) {
fwrite(STDERR, "Error while creating archive file");
exit(1);
}
$zip->addFile("test.jpg", "test.jpg");
$zip->close();
unlink ("test.jpg");
echo "Done";

Выдаёт

Done

Удаляет файл test.jpg

-----------------------

То есть для того чтобы удалить файл, который был добавлен в архив, надо сначала закрыть архив, и только потом удалять этот файл.

Мой скрипт скачивает файлы в цикле, архивирует их в zip-архив и удаляет.

Когда удаляемый файл всего один, то ничего страшного.

Но когда удаляемых файлов много, то:

вариант 1: в теле цикла каждый раз открывать архив, добавлять в него файл, закрывать архив, удалять файл.

вариант 2: перед началом цикла открыть архив, в теле цикла добавлять в архив файл, добавлять имя файла в массив, после цикла закрывать архив, запускать новый цикл, в котором удалять файлы из массива.

Оба варианта кажутся мне дурацкими.

Что делать?

[umka]
На сайте с 25.05.2008
Offline
456
#1

Второй вариант не такой уж и дурацкий.

Можно просто временные файлы складывать в отдельную директорию, а потом её грохать.

Лог в помощь!
S
На сайте с 29.12.2008
Offline
43
#2
'[umka:
;6474706']Второй вариант не такой уж и дурацкий.
Можно просто временные файлы складывать в отдельную директорию, а потом её грохать.

Файлов много, массив будет большой. Тогда надо memory_limit увеличить.

Так у меня файлы скачивает как раз в папку. О! И тогда не нужен массив!

Но ведь нужен второй цикл, который будет удалять файлы.

Я хочу, чтобы добавил файл в архив, и после этого удалил файл.

Почему эта zip-библиотека не закрывает файл, после того, как добавляет его в архив?

Вот файл и не удалить, потому что он открыт zip-библиотекой.

[umka]
На сайте с 25.05.2008
Offline
456
#3
Так у меня файлы скачивает как раз в папку.

Тогда применяйте вариант, который я написал — просто грохать папку по покончании работы и никакие имена файлов не запоминать

S
На сайте с 29.12.2008
Offline
43
#4
'[umka:
;6474717']Тогда применяйте вариант, который я написал — просто грохать папку по покончании работы и никакие имена файлов не запоминать

Так ведь функция rmdir только пустые папки удаляет.

Поэтому придётся удалять файлы в папке, и только потом rmdir ("папка");

[umka]
На сайте с 25.05.2008
Offline
456
#5
srarwars:
Так ведь функция rmdir только пустые папки удаляет.
Поэтому придётся удалять файлы в папке, и только потом rmdir ("папка");

Вариант 1:

<?
system("rm -r /path/to/temp_folder");
?>

Вариант 2:


<?
foreach (glob("/path/to/temp_folder/*") as $filename) {
unlink($filename);
}
rmdir("temp_folder");
?>
samimages
На сайте с 31.05.2009
Offline
427
#6

Второй вариант + в конце упаковки циклом очищать папку и убивать ее.

Опыт как иммунитет — приобретается в муках! Аудит семантики от 15К [долго] - ЛС
S
На сайте с 29.12.2008
Offline
43
#7


$contents = file_get_contents('test.jpg')
$zip->addFromString('test.jpg', $contents);
unlink ('test.jpg');
$zip->close();

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий