|
|
|
| Собственно в названии темы вопрос. есть определенная иерархия папок, в них файлы. нужно все это в таком же составе скопировать в на локальный пк. как это можно сделать? | |
|
|
|
|
|
|
|
для: tonechka
(15.09.2010 в 18:48)
| | Открываете FTP и копируете. | |
|
|
|
|
|
|
|
для: sim5
(15.09.2010 в 19:02)
| | Ну так мне нужно с помощью php- скрипта. я поняла как соединится с ftp, как просмотреть содержимое, но не могу понять с помощью какой функции можно скопировать папку. | |
|
|
|
|
|
|
|
для: tonechka
(15.09.2010 в 19:05)
| | >Ну так мне нужно с помощью php- скрипта
Выполняемого на сервере? | |
|
|
|
|
|
|
|
для: sim5
(15.09.2010 в 19:53)
| | У меня аналогичный вопрос.
Есть фтп сервер, на котором есть определенное кол-во каталогов с файлами. Как скопировать на другой хост (не фтп) все эти каталоги с файлами, соблюдая иерархию.
У меня пока только получается файлы скачивать.
Вот мой скрипт.
$host = "ftp.com";
$connect = ftp_connect($host);
if(!$connect)
{
echo("Ошибка соединения");
exit;
}
$user = "test";
$pass = "111";
$result = ftp_login($connect, $user, $pass);
if (!$result)
{
echo "ошибка авторизации!!!";
}
// скачиваю файл с сервера фтп
$download = ftp_get ($connect, "222.txt", "222.txt", FTP_ASCII);
|
| |
|
|
|
|
|
|
|
для: V@ldem@r
(15.09.2010 в 20:55)
| | Вы считаете, что ваша задача аналогична задаче автора темы? | |
|
|
|
|
|
|
|
для: sim5
(15.09.2010 в 21:47)
| | автор: tonechka (15.09.2010 в 18:48) письмо автору
Собственно в названии темы вопрос. есть определенная иерархия папок, в них файлы. нужно все это в таком же составе скопировать в на локальный пк. как это можно сделать?
У меня аналогичный вопрос.
Есть фтп сервер, на котором есть определенное кол-во каталогов с файлами. Как скопировать на другой хост (не фтп) все эти каталоги с файлами, соблюдая иерархию.
А разве смысл не один и тот же?
Что же тут разного?
Если только автор пишет, что на локальный пк хочет скопировать, а я на хост. Хотя это одно и то же. | |
|
|
|
|
|
|
|
для: V@ldem@r
(15.09.2010 в 22:24)
| | >Если только автор пишет, что на локальный пк хочет скопировать, а я на хост. Хотя это одно и то же.
Даже одно и то же? Это смотря где скрипт у автора, и если на сервере удаленном, то каким образом это вообще выполнимо? | |
|
|
|
|
|
|
|
для: sim5
(15.09.2010 в 22:35)
| | Согласен.
В моем случае это пока на локальном веб сервере надо осуществить.
Суть вопроса моего была не в этом. А в том как все это сделать.
Т.е. скопировать каталоги с файлами в нужную мне директорию на моем локальном сервере. | |
|
|
|
|
|
|
|
для: V@ldem@r
(15.09.2010 в 22:58)
| | Как сделать... ну наверное получить список директорий, создавая на своем подобные, затем переходить по директориям и закачивать файлы к себе. Вы в функции работы с FTP заглядывали? | |
|
|
|
|
|
|
|
для: sim5
(15.09.2010 в 23:05)
| | конечно.
а как проверить что на фтп сервере лежит именно каталог? Вернее условие на различие каталогов от файлов?
Примерно так?
У меня с путями к каталогам на фтп заморочки.
$site = ftp_nlist($connect,"");
foreach ($site as $value)
{
$dirname="/111"; //захожу во вложенную папку
$dirpast="h:/test"; //буду копировать в этот каталог
//проверяю на существование каталога, если каталог, то создаем папку на локальном сервере
if(is_dir($dirname."/".$value))
{
mkdir($dirpast."/".$value);
}
}
|
| |
|
|
|
|
|
|
|
для: V@ldem@r
(15.09.2010 в 23:27)
| | если только имена из ftp_nlist()
то как-нибудь с подзапросом типа if (ftp_size($link, '/root/dir') != -1)
если получали список с помощью ftp_rawlist() то всё уже в массиве.
// php-скрипт может и не проработать столько времени сколько может рекурсивно копироваться дирректория
////array ftp_rawlist ( resource $ftp_stream , string $directory [, bool $recursive= false ] ) | |
|
|
|
|
|
|
|
для: V@ldem@r
(15.09.2010 в 22:58)
| | >Т.е. скопировать каталоги с файлами в нужную мне директорию на моем локальном сервере.
Мне нужно аналогичное сделать.... только я не пойму как обходить папки и подпапки....может кто нибудь хоть примерный скриптик выложить? | |
|
|
|
|
автор: ..... (16.09.2010 в 20:20) |
|
|
для: tonechka
(16.09.2010 в 19:59)
| | примерно так-же как удаляют непустые папки
id_theme=56939 | |
|
|
|
|
|
|
|
для: .....
(16.09.2010 в 20:20)
| | А может кто-нибудь подскажет, как при помощи условия в цикле перебрать инфу на фтп и узнать, каталог это или файл?
И например, если это каталог, то создать папку с таким же именем на локальном сервере, а если это файл, то скачать его.
Что-то вот так. Пока просто не пойму как это реализовать. | |
|
|
|
|
|
|
|
для: V@ldem@r
(19.09.2010 в 20:48)
| | СКажите, а как проверить на фтп файл или папка передо мной? | |
|
|
|
|
|
|
|
для: tonechka
(20.09.2010 в 22:28)
| | ну давали-же Вам ссылку :)
Неужели нельзя без комментариев поразбираться и позаменять удаление на нужное
<?
function ftp_dd($link, $dir)
// рекурсивная функция , обходит папки
{
$list = ftp_nlist($link, $dir); //получение списка имён
$jcou = count($list); // колличество полученных имён
if ($jcou > 2) { // если имён два , то это '.' и '..'
for($j = 0; $j < $jcou; $j++)
{
$fil = $list[($j)]; // в $fil как и в $list[($j)] просто имя
if (($fil == '.') or ($fil == '..')) continue; // пропуск ненужного
$fl = $dir . '/' . $fil ; // В $fl полный путь от корня сервера
if (ftp_size($link, $fl) != -1) { // если полный путь это файл
// @ftp_delete($link, $fl);
# тут надо использовать ftp_get()
} else { // если папка
# тут надо создать папку,
// и вызов снова этой функцию
ftp_dd($link, $fl);
} } }
//if(@ftp_rmdir($link, $dir)) ненадо
}
/*
Вызывается например так
ftp_dd($link, '/ftpdir')
*/
|
1. ftp_rawlist() вместо ftp_nlist() позволит не проверять каждое имя, посылая запросы на ftp-сервер, будет известно сразу файл или папка
2. здесь не хватает передачи локального пути к локальной папке. Нужно добавить функции ещё один параметр
3. Убрал return 1 или return 0. Нужно просто добавить при невыполнении создания папки или ftp_get или при невыполнении nlist , например return 0
и в самом конце функции return 1, тогда например вместо ftp_dd($link, $fl); можно будет написать if (! ftp_dd($link, $fl) ) return 0;
4, соответственно везде надо поставить echo перед return 0 при ошибках , чтобы знать на каком месте оборвалось выполнение
5.Для этого-же, нужно показывать каждое имя файла + ещё если скрипт ничего не покажет в течении KeepAliveTimeout (такая настройка в httpd.conf по умолчанию 5 секунд), то сервер просто убьёт выполнение этого скрипта, и поэтому нужно после echo вызывать почаще ещё и flush();
Вот то немногое что остаётся добавить :) и Как уже говорилось , ещё не факт что так сможете скопировать большую дирректорию. | |
|
|
|
|
|
|
|
для: heed
(20.09.2010 в 23:56)
| | Наверное, я совсем тупа... я вот что делаю:
function ftp_recursive_copy($connect,$dir_local,$dir_remote)
{
echo ftp_pwd($connect);
echo $dir_local;
$site = ftp_rawlist($connect,$dir_remote);//для всех файлов цикл
if (!$site) {echo "НЕТ списка"; return 0;}
foreach ($site as $value)
{
if (($value == '.') or ($value == '..')) continue;
if (ftp_size($connect, $value)!=-1) //если файл
{
ftp_get($connect,$dir_local.'/'.$value,$dir_remote.'/'.$value, FTP_BINARY);//копирую его в новую папку
if (!ftp_get) {echo "Не могу сокпировать файл"; return 0;}
}
else
{
mkdir($dir_local.'/'.$value);
ftp_recursive_copy($connect,$dir_local.'/'.$value, $value);//если папка, то снова вызываю функцию
}
}
return 1;
}
ftp_recursive_copy($connect,'D:/222','/ftp');
|
соответственно он мне выдает, имя папки, в которой сейчас нахожусь, имя локальной папки, куда надо скопировать, и что не может вывести список файлов.... В чем ошибка то??? | |
|
|
|
|
|
|
|
для: tonechka
(21.09.2010 в 11:41)
| | В случае с ftp_rawlist() всё упрощается тем что не надо делать ftp_size($connect, $value) (эта функция выполняет запрос к фтп-серверу )
но немного усложняется тем что в массиве нечто более информативное :) чем имена файлов.
я не знаю сможете-ли понять что там из такого отрывка кода
<?
$file_list = ftp_rawlist($link, $d);
foreach($file_list AS $fl)
{
list($mode, $bloks,
$group, $user, $size,
$month, $day,
$year, $file) = preg_split("/\s+/", $fl);
|
в $mode например может быть -rwxrwxr-x или drwxr-x-rx или lrwxrwxrwx , первый символ в случае с файлом будет '-' с дирректорией 'd' с символической ссылкой 'l'
а там или
if (substr($mode, 0, 1) == 'd')
или
if (($mode[0] == 'd')
надо-же хотя-бы заглядывать что в переменных с помощью var_dump()
а ещё лучше заглядывать ещё и в документацию. К каждой функции есть чёткое описание
>ftp_pwd()
С текущими дирректориями всё сложнее , чем работать с полными путями. php во время работы одного скрипта может даже переподключиться, не говоря о смене дирректорий
(незнаю чего там делаел php , но из дирректорий в которые его просят перейти он точно выскакивает после одной-двух таких комманд
)
ftp_get($connect,$dir_local.'/'.$value,$dir_remote.'/'.$value, FTP_BINARY);//копирую его в новую папку
if (!ftp_get) {echo "Не могу сокпировать файл"; return 0;}
наверное имелось ввиду
if(! ftp_get($connect,$dir_local.'/'.$value,$dir_remote.'/'.$value, FTP_BINARY) { echo "Не могу сокпировать файл"; return 0; } | |
|
|
|
|
|
|
|
для: tonechka
(21.09.2010 в 11:41)
| | Не знаю найдёте-ли документацию php на русском языке
А Вы читали справочник ? :)
http://softtime.ru/group/id_group=8
// Совсем забыл про то что здесь всегда лежал скрипт http://softtime.ru/info/ftpmove.php
Можно поразбираться как там всё работало | |
|
|
|