X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Копирование каталога с содержимым
matroskin8
matroskin8
Topic Starter сообщение 20.9.2010, 19:07; Ответить: matroskin8
Сообщение #1


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


Здесь необходимо вызвать функцию копирования рекурсивно, каждый раз задавая уровень в ней через параметры.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 20.9.2010, 23:02; Ответить: ZiTosS
Сообщение #3


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 узла, которые нужно пропускать - это "."(ссылка на себя) и ".."(ссылка на родитель). А так же нужно понимать, что никаких условий завершения здесь быть не должно. Когда не останется каталогов, функция больше не будет вызывать саму себя, и доработает до конца.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
Topic Starter сообщение 21.9.2010, 10:33; Ответить: matroskin8
Сообщение #4


Ок, спасибо - буду пробовать.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 21.9.2010, 22:18; Ответить: ZiTosS
Сообщение #5


matroskin8, если не получится, поможем.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
Topic Starter сообщение 22.9.2010, 13:59; Ответить: matroskin8
Сообщение #6


Спасибо - все получилось. Это я просто решал для себя задачу, хотя получилось немного методом "тыка"... но все же - все работает :) На практике, конечно, таким пользоваться не стоит ибо рекурсия очень ресурсоемка.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
Topic Starter сообщение 23.9.2010, 13:36; Ответить: matroskin8
Сообщение #7


В процессе решения задачи появился еще 1 вопрос. Сам скрипт копирования каталога лежит на локалхосте, каталог назначения тоже создается на локальной машине, каталог же копируемый находится на удаленном хосте. Насколько я понял в ф-ции opendir() указать URL нельзя... или можно, но как-то его "обернуть", сори за возможный неверный перевод, но так я понял из мануала.
Собственно вопрос, можно ли данной ф-цией открыть каталог на удаленном хосте или возможно ли это сделать каким-либо другим способом?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 23.9.2010, 22:03; Ответить: ZiTosS
Сообщение #8


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

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

Вообще для удаленного общения с хостом в PHP присутствуют функции FTP их и нужно использовать.
Вот вы мне скажите, как вы сможете скачать файлы с удаленного хоста не имея логина и пароля. Всё же файлы по простым протоколам не выдаются
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
Topic Starter сообщение 24.9.2010, 7:44; Ответить: matroskin8
Сообщение #9


Про ф-ции ФТП знаю. Но интересовала именно возможность использования ф-ции opendir(). Понимаю, что скачать ничего с удаленного хоста не зная данных доступа - нельзя, но данные доступа есть.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 26.9.2010, 15:23; Ответить: ZiTosS
Сообщение #10


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


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) [требуется] Копирование лендинга на Wordpress
2 LebedevStr 1422 19.5.2023, 22:35
автор: malamut
Открытая тема (нет новых ответов) Есть работа по наполнению каталога товарами
0 karambas 951 19.12.2020, 0:07
автор: karambas
Открытая тема (нет новых ответов) Продам 4 английских каталога сайтов
в 2 раза дешевле себестоимости
12 autonew 6383 11.8.2018, 10:59
автор: autonew
Открытая тема (нет новых ответов) Только успешные форумы и сайты с тиц от 10 и с яндекс каталога
Только успешные форумы и сайты с тиц от 10 и с яндекс каталога
1 avtoreg2008 2326 29.8.2016, 9:10
автор: andrey10tic
Открытая тема (нет новых ответов) База сайтов Яндекс каталога (Февраль, 2014)
23 mixail77 22172 19.3.2016, 0:35
автор: mixail77


 



RSS Текстовая версия Сейчас: 20.4.2024, 10:15
Дизайн