![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FTP с помощью Indy [D7, XP]
Кукушечка © (2006-02-28 08:58:00)Делаю так, пытаясь закачать файл на FTP с помощью Indy:
f.Connect();
while f.Size('D:\f1.7z') <> f.Size('./f1.7z') do
begin
f.Put('D:\f1.7z','./f1.7z',true);
Application.ProcessMessages;
label1.Caption := IntToStr(f.Size('./TO_Saveliev/f1.7z'));
end;
при этом форма приложения зависает и ни что не рагирует. помогает только Ctrl+F2 в Delphi.
Что не так?
Помогите плиз.
Кукушечка (2006-02-28 16:54:00) [1]
> umbra © (28.02.06 16:30) [36]
>
> Вы свойства антифриза меняли? если да, то поставьте те,
> что были по умолчанию. и если не секрет, что на форме должно
> происходит? и главная ли это форма?
Св-ва антифриза по умолчанию, ничего не меняется.
Форма главная, она же единственная.
что должно происходить, ну хотя-бы можно было нажать кнопку Disconnect.
Форма вичнет как при бесконечном цикле, или очень а ресурсоемких прилжениях. Невозможно сфокусироваться ни на кнопках, ни на TMemo ( в нем кстати выводится FTP-лог).
umbra (2006-02-28 16:30:00) [2]Вы свойства антифриза меняли? если да, то поставьте те, что были по умолчанию. и если не секрет, что на форме должно происходит? и главная ли это форма?
Кукушечка (2006-02-28 16:02:00) [3]
> umbra © (28.02.06 15:41) [34]
>
> тогда
> а) проверьте, что возвращает ftp.Size('D:\f1.7z'). По-моему,
> этот метод не работает с локальными файлами, хотя точно
> не знаю;
> б) при первой попытке закачать файл f1.7z на сервере его
> еще нет, а Вы вызывая ftp.Put('f1.7z','./f1.7z',true);
> пытаетесь добавить содержимое файла к несуществующему файлу
> на сервере. поставьте false.
> в) уберите цикл. он бесполезен в этом месте.
Cделал так ка Вы говорили.
Exceptions не появляются, но антифриз не работает. Файл закачивается.
Форма умирает.
ftp.Size('D:\f1.7z') возвращает -1 следовательно я большой лопух...
umbra (2006-02-28 15:41:00) [4]тогда
а) проверьте, что возвращаетftp.Size('D:\f1.7z'). По-моему, этот метод не работает с локальными файлами, хотя точно не знаю;
б) при первой попытке закачать файлf1.7zна сервере его еще нет, а Вы вызываяftp.Put('f1.7z','./f1.7z', true);пытаетесь добавить содержимое файла к несуществующему файлу на сервере. поставьте false.
в) уберите цикл. он бесполезен в этом месте.
Сергей М. (2006-02-28 15:41:00) [5]
> Ну словлю я это исключение
Вот и "слови" для начала.
Будешь хотя бы знать, какой метод вызвал исключение - то ли Connect, то ли другой .. Это ж ВАЖНО !
> Соединение то все равно прерывается
Антифриз здесь явно ни при чем.
Кукушечка (2006-02-28 15:28:00) [6]
> Сергей М. © (28.02.06 15:17) [31]
>
> Ты про try ..except слышал что-нибудь ?
Ну словлю я это исключение, и что это мне даст?
Соединение то все равно прерывается...
Сергей М. (2006-02-28 15:17:00) [7]Ты про try ..except слышал что-нибудь ?
Кукушечка (2006-02-28 15:14:00) [8]Никому я нехочу морочить голову....
Просто сижу на работе и .....
Ну да... оговорился... конечно же не при компиляции, а при нажатии на Button3, т.е при попытке закачать файл.
И ошибка на строке
while ftp.Size('D:\f1.7z') <> ftp.Size('./f1.7z') do
И проходит не 15 мин, а несколько сек.
Если Вам нехочется, не надо мне отвечать.
> и излагай проблему "as is"
Излагаю.
У меня на форме 2 кнопки: одна Upload вторая Disconnect, компонент TIdFTP и TIdAntiFreeze.
Код.
procedure TForm1.Button3Click(Sender: TObject);
begin
ftp.Host := 'xxx.xxx.xxx.xxx';
ftp.Username := 'xxx';
ftp.Password := 'xxx';
ftp.Connect();
IdAntiFreeze1.Active := true;
if ftp.Connected then
while ftp.Size('D:\f1.7z') <> ftp.Size('./f1.7z') do
begin
ftp.Put('f1.7z','./f1.7z',true);
end;
end;
Свойство IdAntiFreeze1.Activ := false по умолчанию.
При такой активации IdAntiFreeze1 := true выскакивает ошибка
Класс - EIdProtocolReplyError
текст - Timeout (no new data for 900 seconds).
Соответсвенно соединение закрывается и файл ессно не качается.
Если вообще не использовать IdAntiFreeze1 то файл качается, но главная форма ни на что не рагирует. Помогает только Ctrl+F2 в Delphi.
Вот и проблема as is
Сергей М. (2006-02-28 14:57:00) [9]
> Я хочу чтобы не было ошибки
Хочешь ? Это ж замечательно !
Бери букварь и разбирайся, чем отличается компиляция от выполнения.
А если знаешь в чем отличие, то не морочь людям голову и излагай проблему "as is"
umbra (2006-02-28 14:52:00) [10]похоже, Вы решили пошутить и поморочить голову тем, кто Вам отвечает.
EIdProtocolReplyErrorможет появиться только при взаимодействии клиента с сервером, но никак не при компиляции.
веселитесь дальше...
Сергей М. (2006-02-28 14:50:00) [11]
> оштбка происходит при компиляции
Что за бред ?
О каком коннекте ВООБЩЕ может идти речь в compile-time ?
Кукушечка (2006-02-28 14:44:00) [12]
> umbra © (28.02.06 14:32) [25]
>
>
> > Timeout (no new data for 900 seconds)
>
> Вы что, ждали 15 минут? Если да, то закачался ли файл?
Нет, оштбка происходит при компиляции....
umbra (2006-02-28 14:32:00) [13]
> Timeout (no new data for 900 seconds)
Вы что, ждали 15 минут? Если да, то закачался ли файл?
umbra (2006-02-28 14:27:00) [14]или попробуйте поиграть со свойствами TIdAntifreeze. сделайте больше
IdleTimeout, выставьтеApplicationHasPriorytyв false. У Вас может быть медленное соединение, которое сервер закрывает, пока приложение обрабатывает сообщения для пользовательского интерфейса.
Сергей М. (2006-02-28 14:21:00) [15]
> Кукушечка (28.02.06 14:06) [20]
Действительно) .. см. umbra © (28.02.06 14:09) [21] - вывод-то напрашивается сам собой !
На кр.случай брось свои эксперименты с компонентом в осн.код.потоке и вынеси всю работу с ним в дополнительный - тогда никакие "антифризы" тебе не нужны будут.
Кукушечка (2006-02-28 14:18:00) [16]
> umbra © (28.02.06 14:09) [21]
>
>
> > Причем если TIdAntifreeze.Active := false, то все ок.
>
> так сделай его активным после коннекта.
Даааааа....
EIdProtocolReplyError
Timeout (no new data for 900 seconds).
umbra (2006-02-28 14:09:00) [17]
> Причем если TIdAntifreeze.Active := false, то все ок.
так сделай его активным после коннекта.
Кукушечка (2006-02-28 14:06:00) [18]
> Ну и чего ты хочешь ?
Я хочу чтобы не было ошибки.
Читай [10].
Ошибка возникает только тогда когда на форму кидаю TIdAntifreeze, без него все работает и файл загружается!
Как только на форме появляется TIdAntifreezeначинает вылазить ошибка... И именно на строке f.Login;
Причем если TIdAntifreeze.Active := false, то все ок. НО, теряется весь смысл TIdAntifreeze- нет доступа к элементам формы, ситуация [1].
> umbra © (28.02.06 13:53) [19]
Хоть с Connect, хоть без него одно и тоже.....
umbra (2006-02-28 13:53:00) [19]как оказалось после прочтения справки, отдельно Login вызывать не нужно, он вызывается из Connect. Если его вызов убрать, что получится?
Сергей М. (2006-02-28 13:51:00) [20]
> на какой строке ошибка?
> Кукушечка (28.02.06 13:43) [17]
> f.Login;
Ну и чего ты хочешь ?
Ты не прошел авторизацию (неверный логин и/или пароль), до Get/Put же в этом ckexft - как до Китая раком.
Ищи причины отказа в авторизации твоего доступа к серверу, потом уже будут разговоры про всякие там Processmessages