Форум: "Начинающим";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.012 c