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

Вниз

FTP с помощью Indy   Найти похожие ветки 

 
Кукушечка   (2006-02-28 08:58) [0]

Делаю так, пытаясь закачать файл на 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 09:12) [1]


> форма приложения зависает и ни что не рагирует


Put() - блокирующий метод.

Операторы, следующие за Put(), получат управление лишь тогда, когда файл будет выгружен полностью либо в ходе выгрузки произойдет исключение.

Кстати, а зачем append-режим ?


 
Кукушечка   (2006-02-28 09:21) [2]


> Put() - блокирующий метод.
>
> Операторы, следующие за Put(), получат управление лишь тогда,
>  когда файл будет выгружен полностью либо в ходе выгрузки
> произойдет исключение.

Можно как-то подругому?
> Кстати, а зачем append-режим ?

Я так понимаю что это режим докачки файла... или я не прав?


 
Сергей М. ©   (2006-02-28 09:35) [3]


> Можно как-то подругому?


Нет, нельзя.

Но можно бросить на форму компонент TIdAntifreeze, при этом в ходе выгрузки форма сможет реагировать на действия пользователя.


> это режим докачки файла


Это не режим докачки.
В этом режиме выгружаемый файл будет дозаписан в конец указанного файла на FTP-ресурсе.


 
Кукушечка   (2006-02-28 09:36) [4]


> Это не режим докачки.
> В этом режиме выгружаемый файл будет дозаписан в конец указанного
> файла на FTP-ресурсе.


?
А как же режим докачки...


 
Кукушечка   (2006-02-28 09:49) [5]

После добавления  TIdAntifreeze стала появляться ошибка "You aren"t logged in."

???


 
clickmaker ©   (2006-02-28 09:50) [6]


> Кукушечка   (28.02.06 09:49) [5]

User и Password прописаны в Idftp?


 
Сергей М. ©   (2006-02-28 10:05) [7]

Используй Put(Stream, ...) вместо Put(File, ...)


 
Кукушечка   (2006-02-28 10:14) [8]


> > Кукушечка   (28.02.06 09:49) [5]
>
> User и Password прописаны в Idftp?

ессно... :)


 
clickmaker ©   (2006-02-28 10:31) [9]

еще Idftp.AutoLogin должно быть true, либо надо явно вызывать Login после Connect


 
Кукушечка   (2006-02-28 11:10) [10]


> еще Idftp.AutoLogin должно быть true, либо надо явно вызывать
> Login после Connect

У моего Idftp нет свойства AutoLogin, есть только Logon, но я это уже пробовал, непомогает. Выскакивает та жа ошибка  "You aren"t logged in.".

Это только тогда когда на форму кидаю TIdAntifreeze, без него все работает.


 
umbra ©   (2006-02-28 11:15) [11]

а какой тип исключения это сообщение выдает?


 
Кукушечка   (2006-02-28 12:33) [12]


> umbra ©   (28.02.06 11:15) [11]
>
> а какой тип исключения это сообщение выдает?

EIdProtocolReplyError
едрить его в качель...


 
Кукушечка   (2006-02-28 12:35) [13]


> Сергей М. ©   (28.02.06 10:05) [7]
>
> Используй Put(Stream, ...) вместо Put(File, ...)

а смысл, если до Put вообще не доходит?


 
umbra ©   (2006-02-28 12:43) [14]

так а метод Login после Connect пробовали вызывать? и убрать строку Application.ProcessMessages;?


 
Кукушечка   (2006-02-28 13:07) [15]

procedure TForm1.Button3Click(Sender: TObject);
begin
f.Host := "xxxxxxxxxxxxx.ru";
f.Username := "xxx";
f.Password := "xxx";
f.Connect();
f.Login;
if f.Connected then
while f.Size("D:\f1.7z") <> f.Size("./f1.7z") do
 begin
 f.Put("D:\f1.7z","./TO_Saveliev/f1.7z",true);
 end;
end;


Ошибка.


 
umbra ©   (2006-02-28 13:37) [16]

на какой строке ошибка?


 
Кукушечка   (2006-02-28 13:43) [17]

f.Login;


 
Сергей М. ©   (2006-02-28 13:51) [18]


> на какой строке ошибка?
> Кукушечка   (28.02.06 13:43) [17]
> f.Login;


Ну и чего ты хочешь ?

Ты не прошел авторизацию (неверный логин и/или пароль), до Get/Put же в этом ckexft - как до Китая раком.

Ищи причины отказа в авторизации твоего доступа к серверу, потом уже будут разговоры про всякие там Processmessages


 
umbra ©   (2006-02-28 13:53) [19]

как оказалось после прочтения справки, отдельно Login вызывать не нужно, он вызывается из Connect. Если его вызов убрать, что получится?


 
Кукушечка   (2006-02-28 14:06) [20]


> Ну и чего ты хочешь ?

Я хочу чтобы не было ошибки.
Читай [10].
Ошибка возникает только тогда когда на форму кидаю TIdAntifreeze, без него все работает и файл загружается!
Как только на форме появляется TIdAntifreeze начинает вылазить ошибка... И именно на строке f.Login;

Причем если TIdAntifreeze.Active := false, то все ок. НО, теряется весь смысл TIdAntifreeze - нет доступа к элементам формы, ситуация [1].


> umbra ©   (28.02.06 13:53) [19]

Хоть с Connect, хоть без него одно и тоже.....


 
umbra ©   (2006-02-28 14:09) [21]


> Причем если TIdAntifreeze.Active := false, то все ок.

так сделай его активным после коннекта.


 
Кукушечка   (2006-02-28 14:18) [22]


> umbra ©   (28.02.06 14:09) [21]
>
>
> > Причем если TIdAntifreeze.Active := false, то все ок.
>
> так сделай его активным после коннекта.

Даааааа....
EIdProtocolReplyError
Timeout (no new data for 900 seconds).


 
Сергей М. ©   (2006-02-28 14:21) [23]


> Кукушечка   (28.02.06 14:06) [20]


Действительно) .. см. umbra ©   (28.02.06 14:09) [21]  - вывод-то напрашивается сам собой !

На кр.случай брось свои эксперименты с компонентом в осн.код.потоке и вынеси всю работу с ним в дополнительный - тогда никакие "антифризы" тебе не нужны будут.


 
umbra ©   (2006-02-28 14:27) [24]

или попробуйте поиграть со свойствами TIdAntifreeze. сделайте больше IdleTimeout, выставьте ApplicationHasPrioryty в false. У Вас может быть медленное соединение, которое сервер закрывает, пока приложение обрабатывает сообщения для пользовательского интерфейса.


 
umbra ©   (2006-02-28 14:32) [25]


> Timeout (no new data for 900 seconds)

Вы что, ждали 15 минут? Если да, то закачался ли файл?


 
Кукушечка   (2006-02-28 14:44) [26]


> umbra ©   (28.02.06 14:32) [25]
>
>
> > Timeout (no new data for 900 seconds)
>
> Вы что, ждали 15 минут? Если да, то закачался ли файл?


Нет, оштбка происходит при компиляции....


 
Сергей М. ©   (2006-02-28 14:50) [27]


> оштбка происходит при компиляции


Что за бред ?

О каком коннекте ВООБЩЕ может идти речь в compile-time ?


 
umbra ©   (2006-02-28 14:52) [28]

похоже, Вы решили пошутить и поморочить голову тем, кто Вам отвечает.
EIdProtocolReplyError может появиться только при взаимодействии клиента с сервером, но никак не при компиляции.

веселитесь дальше...


 
Сергей М. ©   (2006-02-28 14:57) [29]


> Я хочу чтобы не было ошибки


Хочешь ? Это ж замечательно !
Бери букварь и разбирайся, чем отличается компиляция от выполнения.
А если знаешь в чем отличие,  то не морочь людям голову и излагай проблему "as is"


 
Кукушечка   (2006-02-28 15:14) [30]

Никому я нехочу морочить голову....
Просто сижу на работе и .....

Ну да... оговорился... конечно же не при компиляции, а при нажатии на 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 15:17) [31]

Ты про try ..except  слышал что-нибудь ?


 
Кукушечка   (2006-02-28 15:28) [32]


> Сергей М. ©   (28.02.06 15:17) [31]
>
> Ты про try ..except  слышал что-нибудь ?

Ну словлю я это исключение, и что это мне даст?
Соединение то все равно прерывается...


 
Сергей М. ©   (2006-02-28 15:41) [33]


> Ну словлю я это исключение


Вот и "слови" для начала.
Будешь хотя бы знать, какой метод вызвал исключение - то ли  Connect, то ли другой .. Это ж ВАЖНО !


> Соединение то все равно прерывается


Антифриз здесь явно ни при чем.


 
umbra ©   (2006-02-28 15:41) [34]

тогда
а) проверьте, что возвращает ftp.Size("D:\f1.7z"). По-моему, этот метод не работает с локальными файлами, хотя точно не знаю;
б) при первой попытке закачать файл f1.7z на сервере его еще  нет, а Вы вызывая ftp.Put("f1.7z","./f1.7z",true); пытаетесь добавить содержимое файла к несуществующему файлу на сервере. поставьте false.
в) уберите цикл. он бесполезен в этом месте.


 
Кукушечка   (2006-02-28 16:02) [35]


> 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 16:30) [36]

Вы свойства антифриза меняли? если да, то поставьте те, что были по умолчанию. и если не секрет, что на форме должно происходит? и главная ли это форма?


 
Кукушечка   (2006-02-28 16:54) [37]


> umbra ©   (28.02.06 16:30) [36]
>
> Вы свойства антифриза меняли? если да, то поставьте те,
> что были по умолчанию. и если не секрет, что на форме должно
> происходит? и главная ли это форма?


Св-ва антифриза по умолчанию, ничего не меняется.
Форма главная, она же единственная.
что должно происходить, ну хотя-бы можно было нажать кнопку Disconnect.
Форма вичнет как при бесконечном цикле, или очень а ресурсоемких прилжениях. Невозможно сфокусироваться ни на кнопках, ни на TMemo ( в нем кстати выводится FTP-лог).



Страницы: 1 вся ветка

Текущий архив: 2006.03.19;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.054 c
3-1138032431
pupkin
2006-01-23 19:07
2006.03.19
Создание ADOQuery в run-time


2-1141170188
kizam
2006-03-01 02:43
2006.03.19
VK_A не пашет


2-1141309135
dera
2006-03-02 17:18
2006.03.19
Как, по нажатию на узел в TreeView, вывести текст узла в Label1?


15-1140587632
Ega23
2006-02-22 08:53
2006.03.19
С Днём рождения! 22 февраля


3-1138292589
BBCha
2006-01-26 19:23
2006.03.19
Восстановление удаленной записи