-
Привет мастерам! Нужна сделать прогу для отправки и приёму файлов в FTP сервер. Нужно сделать так чтобы по таймеру обновлял файлы(отправка/приём). Этакое маленькое служба почты. Нашел пример и по примеру сделал процедуру отправка procedure FTPUpload();
var IdFTP:TIdFtp;
dn:integer;
F: TSearchRec;
begin
try
IdFTP:=TIdFTP.Create(nil);
if IdFTP.Connected then
begin
IdFTP.Abort;
IdFTP.Quit;
end;
IdFTP.Username := UserName;
IdFTP.Password := UserPass;
IdFTP.Host := FTPIp;
try
IdFTP.Connect;
if IdFTP.Connected then
begin
IdFTP.ChangeDir('/Send');
chdir('D:\Send\');
dn := FindFirst('*.*',faArchive,F);
while dn = 0 do
begin
IdFTP.Put('D:\Send\'+f.name,f.name);
dn := FindNext(F);
end;
IdFTP.Quit;
end;
ShowMessage('Загрузка завершена.');
except
ShowMessage('Ошибка отправки.');
end;
finally
IdFTP.Free;
end;
end; приём procedure FTPDownload();
var IdFTP:TIdFtp;
dn:integer;
F: TSearchRec;
begin
try
IdFTP:=TIdFTP.Create(nil);
if IdFTP.Connected then
begin
IdFTP.Abort;
IdFTP.Quit;
end;
IdFTP.Username := UserName;
IdFTP.Password := UserPass;
IdFTP.Host := FTPIp;
try
IdFTP.Connect;
if IdFTP.Connected then
begin
IdFTP.ChangeDir('/Recv');
dn := FindFirst('*.*',faArchive,F);
while dn = 0 do
begin
IdFTP.Get(f.name, 'D:\Recv\'+f.name);
dn := FindNext(F);
end;
IdFTP.Quit;
end;
ShowMessage('Прём файлов завершен.');
except
ShowMessage('Ошибка приёма.');
end;
finally
IdFTP.Free;
end;
end; Довнлоад каталога не получается по имени файла нормально получается. И как нужно правильно организовать работу с FTP сервером
-
Либо проблем нет либо они есть и вполне конкретные. А "не получается" - в программировании нет такого слова)
-
> Xmen (15.11.2011 08:25:00) [0]
Я в растерянности, то получается, то нет > не получается по имени файла нормально получается.
-
Изменяюсь за то что конкретно не описал задачу и проблему. У меня получается Upload каталога а Download каталога не работает. Одного файла скачать получился по имени файла а несколько файлов не получился
dn := FindFirst('*.*',faArchive,F);
while dn = 0 do
begin
IdFTP.Get(f.name, 'D:\Recv\'+f.name);
dn := FindNext(F);
end;
не работает. IdFTP.Get('1.doc', 'D:\Recv\1.doc'); работает. У меня обработка каталога не получился. И вопрос я ранше не работал с FTP, как работает докачка файла.
-
> Xmen (15.11.2011 10:18:03) [3]
Странно однако, в FindFirst *.*, а в Get f.name Спрашивается зачем же нужен FindFirst если оно не используется, кроме того неужели ты думаешь что в папке может быть более одного файла с одинаковым имением, ты просто оптимист. Да и справка говорит, что такого прототива вызова нет. Второй параметр должен быть потоком
-
> Download каталога не работает
FindFirst вообще-то функция для локальной ФС. Какое отношение она к download имеет?
-
То то у меня справка нашла, а надо для Инди, а там такой функции нет
-
> Xmen (15.11.11 10:18) [3] > > Изменяюсь за то что конкретно не описал задачу и проблему. > > У меня получается Upload каталога а Download каталога не > работает.
Так как он может работать? Файлы у тебя лежат на сервере, а список ты ищеш локально. TidFtp.List + F1
-
Вот поэтому и спрашивал TidFtp.List нашел и пример автор которого Куликов Алексей после изменения код такой
procedure Download;
var
IdFTP:TIdFtp;
Path: string;
FileList : TStringList;
jj: Integer;
begin
IdFTP:=TIdFTP.Create(nil);
if IdFTP.Connected then
begin
IdFTP.Abort;
IdFTP.Quit;
end;
IdFTP.Username := UserName;
IdFTP.Password := UserPass;
IdFTP.Host := FTPIp;
Path := 'D:\Recv\';
try
IdFTP.Connect();
idFTP.ChangeDir('/Recv');
try
FileList := TStringList.Create;
idFTP.List(FileList,'*.*',False);
for jj := 0 to FileList.Count-1 do
begin
try
idFTP.Get(FileList[jj], Path + FileList[jj], True);
except
on E: Exception do
ShowMessage(Format('Ошибка скачивания',[FileList[jj], E.ClassName, E.Message]));
end;
end;
finally
FreeAndNil(FileList);
end;
IdFTP.Disconnect
except
on E: Exception do
showmessage('Error!'#13#10+E.Message);
end;
И как организовать докачку файла.
-
В протоколе команды rest/reget
В инди смотри сначала resime/restpos
-
IdFTP1.ResumeSupported Это?
-
> Xmen (15.11.2011 14:38:10) [10]
Там в справке все хорошо описано.
-
изменил код на это idFTP.Get(FileList[jj], Path + FileList[jj], False, True); Теперь правильно?
-
Вот другая ошибка при Upload е получил такую ошибку. Файл был где то 50 мегабайтов. Загрузил 9 мегабайтов и получил ошибку. Докачка не получился Socket Error #10054 Connection reset by per
-
Воспользовался примером Demo Name: FTP Client Demo Created By: Doychin Bondzhev On: 27/10/2002 Notes: FTP Client Demo
и он тоже вернул ошибку Socket Error #10054 Connection reset by per Где может быт ошибка, как можно решит проблему?
-
Возьми на вооружение модуль ftpsend из состава Synapse и не мучайся
-
> Xmen (16.11.2011 07:54:14) [14]
Connection reset by peer это не ошибка, а нормальная работа протокола.
-
> Anatoly Podgoretsky © (16.11.11 10:33) [16] > > Xmen (16.11.2011 07:54:14) [14]Connection reset by peer > это не ошибка, а нормальная работа протокола.
Это я понял вот как мне сделать так чтобы снова соединяется с сервером. IdFTP1.Disconnect; IdFTP1.Socket.Close; IdFTP1.Connect; Не получился дала ошибку.
> Сергей М. © (16.11.11 10:10) [15] > Возьми на вооружение модуль ftpsend из состава Synapse и > не мучайся
Это отдельная компонента? И вопрос как правильно организовать работу с FTP сервером. Я так понял что могут быть обрыв связи, докачка файла итд. Есть ли другой компонент лучший чем Indy, простой в использование а то я по гуглу нетак много нашел. Indy in Depth - не про этот компонент :)
-
> Это отдельная компонента?
Это вообще не "компонента". В юните ftpsend.pas есть довольно подробные комментарии по использованию класса TFtpSend
-
Indy тоже вполне нормально может работать. Но у разных фтп-серваков есть свои нюансы. Н-р, кто-то разрешает только пассивный режим и т.п.
|