Статьи Программирование в PHP

Копирование, перемещение и переименование папки в PHP

Копирование каталога

Для копирования папки в PHP необходимо реализовать собственную функцию. Готовое решение можно получить ниже, а сейчас попробуем разобраться, каким образом решается эта задача.

По сути, вся сложность работы с каталогами, а это не только копирование, но и удаление, и перемещение каталога, заключается в содержащихся в них подкаталогах и вложенных файлах. Сложно учесть весь процесс обработки и предусмотреть все возможные события для неопределенного объема вложений. А это может быть:

- некорректно заданный исходный или новый каталог;

- сам новый каталог или вложенные в него файлы уже существуют;

- невозможно выполнить копирование отдельных файлов или папок;

- закончилось место на носителе.


Сам механизм копирования папки сводится к несложному рекурсивному алгоритму, в котором:

1. функции MyCopyAll предлагается скопировать папку "myfolder" в "newfolder".
2. если заданный путь является файлом, то выполняем копирование.
Иначе:
3. если заданной папки не существует, то создаем ее, и выполняем повторный вызов
функции с теми же параметрами.
Иначе:
4. получаем список содержащихся в исходной папке файлов и подкаталогов.
5. запускаем цикл по полученному списку и делаем вызов той же функции
с указанием вложенных директорий.

В итоге получится подобный код:

function 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","newfolder");

Здесь:

- функция 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"); // перемещение

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


Комментарии

Имя:
Текст комментария:
* В комментариях запрещено публиковать рекламные объявления. Сообщения, содержащие ссылки на сторонние ресурсы добавляется в скрытом режиме. Они будут открыты, если не нарушают установленных правил, после проверки.
Защита от спам-роботов (* Обязателельно укажите ответ на простой вопрос ниже.)
Под каким номером в алфавите буква «Б»? (цифра)