Для копирования папки в PHP необходимо реализовать собственную функцию. Готовое решение можно получить ниже, а сейчас попробуем разобраться, каким образом решается эта задача.
По сути, вся сложность работы с каталогами, а это не только копирование, но и удаление, и перемещение каталога, заключается в содержащихся в них подкаталогах и вложенных файлах. Сложно учесть весь процесс обработки и предусмотреть все возможные события для неопределенного объема вложений. А это может быть:
- некорректно заданный исходный или новый каталог;
- сам новый каталог или вложенные в него файлы уже существуют;
- невозможно выполнить копирование отдельных файлов или папок;
- закончилось место на носителе.
Сам механизм копирования папки сводится к несложному рекурсивному алгоритму, в котором:
1. функции MyCopyAll предлагается скопировать папку "myfolder" в "newfolder".
2. если заданный путь является файлом, то выполняем копирование.
Иначе:
3. если заданной папки не существует, то создаем ее, и выполняем повторный вызов
функции с теми же параметрами.
Иначе:
4. получаем список содержащихся в исходной папке файлов и подкаталогов.
5. запускаем цикл по полученному списку и делаем вызов той же функции
с указанием вложенных директорий.
В итоге получится подобный код:
my_copy_all($from, $to) {
if (is_dir($from)) {
@mkdir($to);
$d = dir($from);
while (false !== ($entry = $d->read())) {
if ($entry == "." || $entry == "..") continue;
my_copy_all("$from/$entry", "$to/$entry");
}
$d->close();
}
else copy($from, $to);
}
my_copy_all("myfolder",
Здесь:
- функция is_dir проверяет, является ли заданный объект каталогом;
- функция mkdir пытается создать директорию (символ @ указывает не выводить ошибки, если создать каталог не получается);
- функция copy копирует файл;
- функция dir создает объект для работы с каталогом;
- $d->read() – выполняет чтение имени объекта (файла или папки) из объекта каталога;
- $d->close() – завершает работу с объектом каталога.
Полученная функция выполняет копирование папки со всеми вложениями, заменяя имеющиеся в новой директории файлы, если они есть. Если нужно сохранять старые файлы, можно добавить условие перед копированием файла. Но лучше добавить параметр, отвечающий за перезапись файлов:
function my_copy_all($from, $to, $rewrite = true) {
if (is_dir($from)) {
@mkdir($to);
$d = dir($from);
while (false !== ($entry = $d->read())) {
if ($entry == "." || $entry == "..") continue;
my_copy_all("$from/$entry", "$to/$entry", $rewrite);
}
$d->close();
} else {
if (!file_exists($to) || $rewrite)
copy($from, $to);
}
}
my_copy_all("myfolder","newfolder", false); // вызов копирования без перезаписи
И перемещение, и переименование папки выполняется одной функцией rename. В качестве параметров ей задается путь к исходному каталогу, и новый путь.
rename("myfolder","newfolder"); // переименование
rename("myfolder","newfolder/myfolder"); // перемещение
При этом, проблема может возникнуть при попытке переименовать папку в уже имеющуюся на диске. В этом случае будет выведена ошибка. Для случаев, когда нужно переместить папку с вложениями, где могут встречаться пересечения названий, стоит реализовать свою функцию аналогично приведенной функции копирования, или же просто воспользоваться копированием паки, а затем удалить старую папку.
Создание, открытие, чтение, запись, удаление и проверка наличия файла в PHP
Функция empty в PHP, описание и примеры
Работа с датой и временем в PHP
В комментариях запрещено публиковать рекламные материалы. Все сообщения оправляются на модерацию и будут опубликованы, если не нарушают правил сайта после проверки.