Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Продолжение пересылки файлов на FTP после обрыва связи [D7, WinXP]


Страницы:   1 2

Inearthed ©   (2007-07-24 08:32:00) 

Доброго времени суток, коллеги!
Пишу программу для передачи файлов по FTP. Если вдруг связь оборвется, как продолжить пересылку с прерванного места? Использую компонент IdFtp библиотеки Indy. Буду рад помощи, заранее спасибо.


adan   (2007-08-08 20:24:00) [1]

ну вот, на самом интересном месте!!! :-(


Сергей М.   (2007-07-24 13:48:00) [2]


> повторный Get вызывать ведь не надо? Т.е Get продолжается
> при следующем коннекте?


Как это не надо ? Надо ! С параметром AResume = True, если требуется дозагрузка.


> при следующем коннекте Put также продолжает пересылку с
> прерванного места?


Нет.

Put() будет выгружать то что ты ему укажешь.

AApend=true нужен для указания серверу, что те данные, которые он получает в тек.сессии выгрузки, следует дозаписать в конец указанного файла.


Inearthed   (2007-07-24 13:41:00) [3]

Спасибо, Сергей, узнал что-то новое. (хоть докачка пока и не работает как надо) Буду еще обращаться на форум. ;)
Наверное, последние тупые вопросы по теме, чтобы забетонировать в себе полученные знания, а там уже буду сам разбираться:
Итак,
Когда CanResume вызывается, повторный Get вызывать ведь не надо? Т.е Get продолжается при следующем коннекте?
Насчет Put аналогичный вопрос: когда AApend=true, при следующем коннекте Put также продолжает пересылку с прерванного места?


Сергей М.   (2007-07-24 13:15:00) [4]

while not ftp.Connected do
try
 ftp.Connect;
except
end;


Inearthed   (2007-07-24 13:10:00) [5]

Но что это даст? Повторный коннект за пределами обработчика будет удачен только в случае восстановления связи, иначе будет снова исключение. Поэтому возможно, что коннект и вызов обработчика исключений придется делать не раз. Как пересылка потом продолжится? Что-то мне подсказывает, что ответом на этот вопрос может быть цикл while:

while //нет коннекта (что сюда писать?)
do
//....


Или предложи свой вариант. Заранее спасибо.


Сергей М.   (2007-07-24 12:56:00) [6]


> вот сюда что писать?


Ничего ни пиши.

except
 MyFtp.Disconnect;
end;


Inearthed   (2007-07-24 12:52:00) [7]

Тогда переформулирую вопрос.
В куске исходника:

except
on  {вот сюда что писать??} do begin


Сергей М.   (2007-07-24 12:41:00) [8]


> Я так понял что эти исключения не принадлежат классу EIdException


На основании чего ты сделал такой вывод ?


> как обработать чтобы она дожидалась коннекта


Никак.
В обработчике просто делай дисконнект.
Повторный коннект - за пределами обработчика.


Inearthed   (2007-07-24 12:31:00) [9]

Вот я и спрашиваю, как обработать чтобы она дожидалась коннекта и продолжила пересылку? И ума не приложу, какие именно исключения обрабатывать. Я так понял что эти исключения не принадлежат классу EIdException. Socket error # 0, например, вообще непонятно на что он ругается.


Сергей М.   (2007-07-24 12:24:00) [10]

Ну так обработай эти исключения, в чем проблема ?


Inearthed   (2007-07-24 12:22:00) [11]

На рабочем столе "Сетевые подключения" -> свойства -> подключение по локальной сети -> в контекстном меню "Отключить".


Сергей М.   (2007-07-24 12:16:00) [12]


> Отключаю сетевые подключения с целью имитации обрыва связи


Как отключаешь ?


Inearthed   (2007-07-24 12:08:00) [13]

Антифриз использую, да, а что?
Отключаю сетевые подключения с целью имитации обрыва связи.


Сергей М.   (2007-07-24 12:00:00) [14]


> нажимаю на кнопку


Антифриз что ли используешь ?


> отключаю сетевые подключения


Это еще зачем ?


Inearthed   (2007-07-24 11:48:00) [15]

Для Get аналогичная проверка закончилась исключением Socket Error # 10054 - коннект прерван. Может надо как-то обработать это исключение, чтобы она дожидалась коннекта и продолжила пересылку? Если да, то как?


Inearthed   (2007-07-24 11:26:00) [16]

Спасибо за помощь. Тестирую программу. Вот фрагмент исходника
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. Что это и что с этим делать?


Сергей М.   (2007-07-24 10:31:00) [17]


> для 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 10:19:00) [18]

То есть я набираю

IdFtp1.CanResume;

после чего вызываю Get и после обрыва связи он будет автоматически докачивать с прерванного места? Так просто?
А для Put работает также или?..


Сергей М.   (2007-07-24 10:12:00) [19]


> как это использовать?


Читать справку к методу Get() в части параметра Resume


> многое неясно


Что конкретно ?


> Вызывать IdFtp.Quote нужно или я не прав?


Ну черным по белому написано же в справке :

обращение к св-ву CanResume сводится к вызову метода ResumeSupported, который, в свою очередь, вызывает метод Quote, запрашивающий у сервера инф-цию о возможности докачки


Inearthed   (2007-07-24 09:54:00) [20]

Почитал, и как это использовать? Все равно еще многое неясно.
И еще вопрос в связи с этим: Вызывать IdFtp.Quote нужно или я не прав?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо