-
> Xmen (16.11.11 11:18) [17]
Трудно назвать Инди лучшим.
-
> Indy тоже вполне нормально может работать.
Но не у всех это получается.
-
> Трудно назвать Инди лучшим
"Эт точно" (с) Ф.Сухов
Трижды подумать надо, прежде чем тянуть в проект этого глюкавого монстра ради тривиальной задачи под конкретную платформу
-
> Сергей М. © (16.11.11 11:39) [18]
> > Это отдельная компонента?Это вообще не "компонента".В
> юните ftpsend.pas есть довольно подробные комментарии по
> использованию класса TFtpSend
на этом юните сделал отправку и приём файлов.
procedure TForm1.Button7Click(Sender: TObject);
var dn, i:integer;
F: TSearchRec;
begin
i:=0;
chdir('D:\Send\');
dn := FindFirst('*.*',faArchive,F);
while dn = 0 do
begin
FTPClient.DataStream.LoadFromFile(f.Name);
FTPClient.StoreFile(ExtractFileName(FTPClient.GetCurrentDir+'\Send\'+f.Name),false);
FTPClient.
DeleteFile(f.Name);
Memo1.Lines.Add('Çàãðóæåí ôàéë: '+F.Name+' âðåìÿ çàêà÷êè: '+datetimetostr(NOW));
inc(i);
dn := FindNext(F);
end;
Memo1.Lines.Add('Óñïåøíî çàêà÷àííûõ ôàéëîâ: '+inttostr(i));
refreshDir;
end;
procedure TForm1.Button8Click(Sender: TObject);
var i:integer;
begin
for i := 0 to FTPClient.FtpList.Count-1 do
begin
try
FTPClient.RetrieveFile(FTPClient.GetCurrentDir+'\Recv\'+FTPClient.FtpList[i].FileName,false);
FTPClient.DataStream.SaveToFile('D:\RECV\'+FTPClient.FtpList[i].FileName);
FTPClient.DeleteFile(FTPClient.GetCurrentDir+'\Recv\'+FTPClient.FtpList[i].FileName);
Memo1.Lines.Add('Ñêà÷àí ôàéë: '+FTPClient.FtpList[i].FileName+' âðåìÿ: '+datetimetostr(NOW));
except
on E: Exception do ShowMessage('Îøèáêà ïðè ñêà÷èâàíèè ôàéëà %s'#13#10'class:%s'#13#10'%s'+FTPClient.FtpList[i].FileName);
end;
end;
Memo1.Lines.Add('Óñïåøíî ñêà÷àííûõ ôàéëîâ: '+inttostr(FTPClient.FtpList.Count));
refreshDir;
end;
Теперь нужно организовать процесс процента закачки и скачки через прогрессбар. Как это можно сделать в ftpsend е
-
unit blcksock
..
TBlockSocket
..
{:This event is called by various reasons. It is good for monitoring socket,
create gauges for data transfers, etc.}
property OnStatus: THookSocketStatus read FOnStatus write FOnStatus;
-
> Сергей М. © (18.11.11 15:17) [24]
> unit blcksock..TBlockSocket.. {:This ev
stacktrace: n/a; see opera:config#UserPrefs|Exceptions Have Stacktraceent is called
> by v
stacktrace: n/a; see opera:config#UserPrefs|Exceptions Have Stacktracearious reasons. It is good for monitoring socket,
> create gauges for data transfers, etc.} property OnStatus:
> THookSocketStatus read FOnStatus write FOnStatus;
Спасибо.
как это в коде реализовать?
(уже начинаю тупеть)
-
Вновь вернулся на этот вопрос.
Создал код и оно работает. Но не могу понять вот если соединения разорвался в ФТП отправлен файл но не полностью как там в ФТП узнать что этот файл неполный то есть я должен скопировать эту папку с файлами и не должен скопировать такие файлы.
-
По протоколу разрыв соединения есть признак окончания передачи. Поэтому на FTP серверах рядом с файлом помещают файл с контрольной суммой.
-
> Anatoly Podgoretsky © (13.12.11 15:10) [27]
> По протоколу разрыв соединения есть признак окончания передачи.
> Поэтому на FTP серверах рядом с файлом помещают файл с
> контрольной суммой.
Сейчас проверю
-
Сервер FileZila клиент Total отправил 2 гига файла и отменил копирование. Поискал этот файл с контрольной суммой но не нашел. Где искать надо?
У меня есть клиент на Delphi.
-
Ты его сам должен послать, автоматом это не делается.
-
То есть как?
Путём сравнения файла?
Помогите еще ...
-
> Xmen (13.12.2011 15:40:31) [31]
Очень просто, на сервер отсылаются два файла, а при считывании расчитывается
новая контрольная суммв, если она не совпадает, то ошибка передачи.
-
То есть я сначала пишу контрольную сумму в файл и скопирую файл с текстом контрольной суммой в FTP. Потом идет сравнение файла.
-
> Xmen (13.12.2011 16:14:33) [33]
Нет файлы (оба) тоже надо отправить на сервер
-
> Anatoly Podgoretsky © (13.12.11 16:25) [34]
> > Xmen (13.12.2011 16:14:33) [33]Нет файлы (оба) тоже
> надо отправить на сервер
Да уважаемый гуру я это понял, наверно сначала должен отправит контрольный файл а потом сам файл. Когда копирую с ФТП сначала идет сравнение а потом копирование и удаление контрольного файла или когда закачка на сервер файла закончена то удаляю контрольный файл.
-
> Xmen (13.12.2011 16:44:35) [35]
Конечно первым контрольный файл.
Копирование идет всегда, иначе сравнение не возможно.
На сервере файл не надо удалять.
-
Можете проверит сделал так.
var dn, i, j:integer;
F: TSearchRec;
MyFile:TextFile;
newFile, ftpFileName:string;
ftpFileSize:Integer;
begin
LogFTP;
if FTPStatus=1 then
if ListView3.Items.Count>0 then
begin
i:=0;
ProgressBar2.Max:= ListView3.Items.Count-1;
ProgressBar2.Min := 0;
ProgressBar2.Position := 0;
Memo1.Lines.Add('Открыт соединение с сервером');
dn := FindFirst(path+'Send\*.*',faArchive,F);
while dn = 0 do
begin
ProgressBar1.Position := 0;
TotalBytes :=F.Size;
newFile:=copy(f.Name,1,Length(f.Name)-4)+'.crc';
AssignFile(MyFile,path+'Send\'+newFile);
try
Rewrite(MyFile);
Write(MyFile,TotalBytes);
finally
CloseFile(MyFile);
FTPClient.DataStream.LoadFromFile(path+'Send\'+newFile);
FTPClient.StoreFile(ExtractFileName(FTPClient.GetCurrentDir+'Send/'+NewFile), false);
end;
FTPClient.DSock.OnStatus := SockPutCallBack;
FTPClient.DataStream.LoadFromFile(path+'Send\'+f.Name);
Memo1.Lines.Add('Отправка файла: ' + f.Name+' Размер: ' + IntToStr(TotalBytes));
if FTPClient.StoreFile(ExtractFileName(FTPClient.GetCurrentDir+'Send/'+f.Name), false) = true then
begin
FTPClient.List(FTPClient.GetCurrentDir+'/Send/',false);
for j := 0 to FTPClient.FtpList.Count-1 do
begin
ftpFileName:= FTPClient.FtpList[j].FileName ;
ftpFileSize:= FTPClient.FileSize(FTPClient.GetCurrentDir+'Send/'+FTPClient.FtpList[j].FileName);;
if (ftpFileName=f.Name) and (TotalBytes = ftpFileSize) then
begin
Memo1.Lines.Add('Загружен файл: '+F.Name+' время закачки: '+datetimetostr(NOW));
inc(i);
DeleteFile(path+'Send\'+f.Name);
DeleteFile(path+'Send\'+NewFile);
Break;
end;
end;
ProgressBar1.Position := 0;
Update;
end
else Memo1.lines.add('Ошибка отправки');
ProgressBar2.Position := ProgressBar2.Position + 1;
dn := FindNext(F);
end;
Memo1.Lines.Add('Успешно закачанных файлов: '+inttostr(i));
Memo1.Lines.Add('Соединение закрыто');
ProgressBar2.Position :=0;
end;
LogoutFTP;
end;
Это для отправки в сервер.
-
> Xmen (15.12.2011 11:35:37) [37]
> ftpFileSize:=
> FTPClient.FileSize(FTPClient.GetCurrentDir+'Send/'+FTPClient.FtpList[j].FileName);;//если
> в сервер закачан файл и его размер подходит то ..
Это не гарантирует целостности файла
-
а как нужно тогда правильно сделать