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

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

FTP с помощью Indy [D7, XP]


Страницы:   1 2

Кукушечка ©   (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


Страницы:   1 2

Наверх

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