Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
3-1197527318
abhtr
2007-12-13 09:28
2008.05.18
Как восстановить удаленные записи в таблице Firebird


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


2-1208929981
Джек874585
2008-04-23 09:53
2008.05.18
Юникод в Delphi


2-1208350194
lamponaftik
2008-04-16 16:49
2008.05.18
Need хелп=)


15-1207596565
TStas
2008-04-07 23:29
2008.05.18
Чем открывать формат .djvu?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский