Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.18;
Скачать: CL | DM;

Вниз

Продолжение пересылки файлов на 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.02 c
15-1207325337
tesseract
2008-04-04 20:08
2008.05.18
IPhone vs другие


2-1208326809
andreil
2008-04-16 10:20
2008.05.18
Почемуто переменная сама меняется :(


15-1206900897
DVM
2008-03-30 22:14
2008.05.18
2 копии Win на одном компьютере и перевод времени.


2-1208326305
Mishenka
2008-04-16 10:11
2008.05.18
Как в TEdit определить в какой позиции находится курсор?


8-1180440644
borodaj
2007-05-29 16:10
2008.05.18
попиксельное сравнение изображений