Перейти к содержимому


Партнерская программа Kredov

Копирование каталога с содержимым

#1 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143
0

Отправлено 20 Сентябрь 2010 - 18:07

Попалась такая задачка - сделать копию каталога со всем содержимым (с каталогами и файлами внутри). Все просто, если размер вложенности одноуровневый, если же уровней больше - то ничего не приходит в голову. ;)
Поясню на примере: есть каталог, к примеру, folder_main... в нем находятся файлы. Просто скопировать все файлы, например в каталог folder_copy, - не проблема. Проблема возникает тогда, когда в каталоге находится еще 1 каталог - допустим sub_folder1 - со своими файлами, а в последнем еще каталог и т.д. Т.е., загвоздка в том, чтобы скопировать структуру и файлы вида folder_main(файлы) - sub_folder1(файлы) - sub_folder2(файлы) - sub_folderN(файлы)...
Надеюсь понятно объяснил :)

 

 

  • 0


#2 gaaarfild

gaaarfild
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 20 Сентябрь 2010 - 18:32

Здесь необходимо вызвать функцию копирования рекурсивно, каждый раз задавая уровень в ней через параметры.
  • 0

#3 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 20 Сентябрь 2010 - 22:02

matroskin8,

1) Почитайте про рекурсию, данный метод вам поможет в копировании бесконечной вложенности папок.
2) Вам нужно поочередно проходить по каталогу, спускаясь от узла к узлу и проверять, что за узел - папка или файл. Если папка, то вызываем функцию копирования папки, а в качестве параметра текущую папку + имя каталога. Если файл, то просто копируем его в текущий каталог.

Вот и весь алгоритм.Покажу как примерно происходит копирование при рекурсии по действиям
(1) главная папка
(2)   папка 1
(3)	  папка 1_1
(4)		 файл 1_1_1
(5)	  папка 1_2
(6)		 файл 1_2_1
(7)		 файл 1_2_2
(8)	  файл 1_3
(9)	  папка 1_4
(10)		папка 1_4_1
(11)		файл 1_4_2
(12)		файл 1_4_3
(13)		папка 1_4_4
(14)		   файл 1_4_4_1
(15)  папка 2
(16)	 файл 2_1
В скобках указан порядок действия копирования. Что тут нужно уяснить. Изначально вызываем функцию копирования и передаём ей в качестве параметра путь до главного каталога копирования и вторым параметром название этого каталога, а так же путь куда копируем. Эта функция создаёт относительно пути копирования папку и начинает в неё копировать содержимое источника, как только функция нашла в списке узлов каталог, она вызывает саму себя, но в качестве параметров уже передаёт путь до каталога, который надо скопировать и уже его имя и так далее.

Таким образом, функция копирует файлы. Как только она находит каталог, то вызывает саму себя. Начинает выполняться вызванная внутренняя функция(т.е. та же самая функция, но с др. параметрами). Как только она завершится, продолжит свою работу внешняя функция, которая продолжит копировать файлы. Если найдется ещё каталог, то будет вызвана опять рекурсивная функция(функция вызовет саму себя).

Понятное дело, что не нужно забывать, что в каждом каталоге имеются 2 узла, которые нужно пропускать - это "."(ссылка на себя) и ".."(ссылка на родитель). А так же нужно понимать, что никаких условий завершения здесь быть не должно. Когда не останется каталогов, функция больше не будет вызывать саму себя, и доработает до конца.
  • 0

#4 matroskin8

matroskin8
    Topic Starter
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 21 Сентябрь 2010 - 09:33

Ок, спасибо - буду пробовать.
  • 0


#5 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 21 Сентябрь 2010 - 21:18

matroskin8, если не получится, поможем.
  • 0

#6 matroskin8

matroskin8
    Topic Starter
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 22 Сентябрь 2010 - 12:59

Спасибо - все получилось. Это я просто решал для себя задачу, хотя получилось немного методом "тыка"... но все же - все работает :) На практике, конечно, таким пользоваться не стоит ибо рекурсия очень ресурсоемка.


  • 0


#7 matroskin8

matroskin8
    Topic Starter
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 23 Сентябрь 2010 - 12:36

В процессе решения задачи появился еще 1 вопрос. Сам скрипт копирования каталога лежит на локалхосте, каталог назначения тоже создается на локальной машине, каталог же копируемый находится на удаленном хосте. Насколько я понял в ф-ции opendir() указать URL нельзя... или можно, но как-то его "обернуть", сори за возможный неверный перевод, но так я понял из мануала.
Собственно вопрос, можно ли данной ф-цией открыть каталог на удаленном хосте или возможно ли это сделать каким-либо другим способом?
  • 0


#8 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 23 Сентябрь 2010 - 21:03

matroskin8,

Начиная с версии PHP 4.3.0, параметр путь может также являться любым URL'ом, обращение к которому приводит к получению списка его файлов и каталогов. Однако, данный способ работает только при использовании url-упаковщика file://. В версии PHP 5.0.0 была добавлена поддержка url-упаковщика ftp://

По протоколам file и ftp можно почитать здесь пункт 3.3 Некоторые схемы URL

Вообще для удаленного общения с хостом в PHP присутствуют функции FTP их и нужно использовать.
Вот вы мне скажите, как вы сможете скачать файлы с удаленного хоста не имея логина и пароля. Всё же файлы по простым протоколам не выдаются
  • 0

#9 matroskin8

matroskin8
    Topic Starter
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 24 Сентябрь 2010 - 06:44

Про ф-ции ФТП знаю. Но интересовала именно возможность использования ф-ции opendir(). Понимаю, что скачать ничего с удаленного хоста не зная данных доступа - нельзя, но данные доступа есть.
  • 0


#10 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 26 Сентябрь 2010 - 14:23

matroskin8, не пробовал, поэтому точно не знаю. Но попробуйте подключиться сначала по HTTP и FTP, указав в качестве ссылки данные в формате:
http://www.ipm.kstu.ru/it/lec/3.php пункт 3.3
Там указана как должна строиться ссылка. Попробуйте и http и ftp. Прошу отписаться если что-либо удастся ;)
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru