Форум: "Сети";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];
ВнизПродолжение пересылки файлов на FTP после обрыва связи Найти похожие ветки
← →
Inearthed (2007-07-24 08:32) [0]Доброго времени суток, коллеги!
Пишу программу для передачи файлов по FTP. Если вдруг связь оборвется, как продолжить пересылку с прерванного места? Использую компонент IdFtp библиотеки Indy. Буду рад помощи, заранее спасибо.
← →
Сергей М. © (2007-07-24 08:36) [1]
> как продолжить пересылку с прерванного места?
Никак, если сервер не поддерживает такую возможность.
← →
Inearthed (2007-07-24 09:17) [2]А если поддерживает??????
← →
Сергей М. © (2007-07-24 09:35) [3]Тогда читай справку к св-ву TIdFTP.CanResume
← →
Inearthed (2007-07-24 09:54) [4]Почитал, и как это использовать? Все равно еще многое неясно.
И еще вопрос в связи с этим: Вызывать IdFtp.Quote нужно или я не прав?
← →
Сергей М. © (2007-07-24 10:12) [5]
> как это использовать?
Читать справку к методу Get() в части параметра Resume
> многое неясно
Что конкретно ?
> Вызывать IdFtp.Quote нужно или я не прав?
Ну черным по белому написано же в справке :
обращение к св-ву CanResume сводится к вызову метода ResumeSupported, который, в свою очередь, вызывает метод Quote, запрашивающий у сервера инф-цию о возможности докачки
← →
Inearthed (2007-07-24 10:19) [6]То есть я набираю
IdFtp1.CanResume;
после чего вызываю Get и после обрыва связи он будет автоматически докачивать с прерванного места? Так просто?
А для Put работает также или?..
← →
Сергей М. © (2007-07-24 10:31) [7]
> для Put работает также или?
Put() не имеет отношения к дозагрузке, здесь речь идет уже о довыгрузке.
Читаем:
Setting AAppend to True causes the server to append the file being uploaded to one which already exists on the FTP server
← →
Inearthed (2007-07-24 11:26) [8]Спасибо за помощь. Тестирую программу. Вот фрагмент исходника
procedure TForm1.Button1Click(Sender: TObject);
begin
IdFtp1.Username:=FtpLoginEdit.Text;IdFtp1.Password:=FtpPasEdit.Text;
IdFtp1.Host:=FtpHostEdit.Text;IdFtp1.Connect(true,20000);
try
IdFtp1.Put("C:\test.zip","/Test/test.zip",true); //4
showmessage("передача прошла успешно");
except
on EIDProtocolReplyError do begin
IdFtp1.Delete("/test/test.zip");
IdFtp1.Put("C:\test.zip","/Test/test.zip",true);
showmessage("передача прошла успешно");
end;
end;
IdFtp1.Disconnect;
end;
В процессе выполнения программы нажимаю на кнопку и отключаю сетевые подключения. Программа вызывает исключение Socket Error # 0. Что это и что с этим делать?
← →
Inearthed (2007-07-24 11:48) [9]Для Get аналогичная проверка закончилась исключением Socket Error # 10054 - коннект прерван. Может надо как-то обработать это исключение, чтобы она дожидалась коннекта и продолжила пересылку? Если да, то как?
← →
Сергей М. © (2007-07-24 12:00) [10]
> нажимаю на кнопку
Антифриз что ли используешь ?
> отключаю сетевые подключения
Это еще зачем ?
← →
Inearthed (2007-07-24 12:08) [11]Антифриз использую, да, а что?
Отключаю сетевые подключения с целью имитации обрыва связи.
← →
Сергей М. © (2007-07-24 12:16) [12]
> Отключаю сетевые подключения с целью имитации обрыва связи
Как отключаешь ?
← →
Inearthed (2007-07-24 12:22) [13]На рабочем столе "Сетевые подключения" -> свойства -> подключение по локальной сети -> в контекстном меню "Отключить".
← →
Сергей М. © (2007-07-24 12:24) [14]Ну так обработай эти исключения, в чем проблема ?
← →
Inearthed (2007-07-24 12:31) [15]Вот я и спрашиваю, как обработать чтобы она дожидалась коннекта и продолжила пересылку? И ума не приложу, какие именно исключения обрабатывать. Я так понял что эти исключения не принадлежат классу EIdException. Socket error # 0, например, вообще непонятно на что он ругается.
← →
Сергей М. © (2007-07-24 12:41) [16]
> Я так понял что эти исключения не принадлежат классу EIdException
На основании чего ты сделал такой вывод ?
> как обработать чтобы она дожидалась коннекта
Никак.
В обработчике просто делай дисконнект.
Повторный коннект - за пределами обработчика.
← →
Inearthed (2007-07-24 12:52) [17]Тогда переформулирую вопрос.
В куске исходника:except
on {вот сюда что писать??} do begin
← →
Сергей М. © (2007-07-24 12:56) [18]
> вот сюда что писать?
Ничего ни пиши.
except
MyFtp.Disconnect;
end;
← →
Inearthed (2007-07-24 13:10) [19]Но что это даст? Повторный коннект за пределами обработчика будет удачен только в случае восстановления связи, иначе будет снова исключение. Поэтому возможно, что коннект и вызов обработчика исключений придется делать не раз. Как пересылка потом продолжится? Что-то мне подсказывает, что ответом на этот вопрос может быть цикл while:
while //нет коннекта (что сюда писать?)
do
//....
Или предложи свой вариант. Заранее спасибо.
← →
Сергей М. © (2007-07-24 13:15) [20]while not ftp.Connected do
try
ftp.Connect;
except
end;
← →
Inearthed (2007-07-24 13:41) [21]Спасибо, Сергей, узнал что-то новое. (хоть докачка пока и не работает как надо) Буду еще обращаться на форум. ;)
Наверное, последние тупые вопросы по теме, чтобы забетонировать в себе полученные знания, а там уже буду сам разбираться:
Итак,
Когда CanResume вызывается, повторный Get вызывать ведь не надо? Т.е Get продолжается при следующем коннекте?
Насчет Put аналогичный вопрос: когда AApend=true, при следующем коннекте Put также продолжает пересылку с прерванного места?
← →
Сергей М. © (2007-07-24 13:48) [22]
> повторный Get вызывать ведь не надо? Т.е Get продолжается
> при следующем коннекте?
Как это не надо ? Надо ! С параметром AResume = True, если требуется дозагрузка.
> при следующем коннекте Put также продолжает пересылку с
> прерванного места?
Нет.
Put() будет выгружать то что ты ему укажешь.
AApend=true нужен для указания серверу, что те данные, которые он получает в тек.сессии выгрузки, следует дозаписать в конец указанного файла.
← →
adan (2007-08-08 20:24) [23]ну вот, на самом интересном месте!!! :-(
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.04 c