با سلام
من درکتاب آموزشی Bob روش زیر رو برای آپدیت کلاینت دیدم. روشش بدین صورته که اگه نسخه جدیدی از کلاینت طراحی شده بود، فایل اجرایی به سمت کلاینت منتقل شده و با فایل اونجا جابجا میشه.
با کد زیر فایل اجرایی در قالب Filestream منتقل میشه
function TServerMethods1.ClientStream: TStream;
var
Update: string;
begin
Result := nil;
Update := '';
with TIniFile.Create('E:\MyDocuments\RAD Studio\Projects\ProjGrp2.0\Win32\Debug\AutomaticUp dates.ini') do
try
Update := ReadString('Client', 'Client.exe', '');
if (Update <> '') then
Result := TFileStream.Create(Update, fmOpenRead or fmShareDenyWrite);
finally
Free;
end;
end;
و با کد زیر در سمت کلاینت عملیات جایگزینی انجام میشه
procedure TForm_Update.Btn_OkClick(Sender: TObject);
const
iBuffSize = 32 * 1024;
var
Stream: TStream;
FileStream: TFileStream;
Buffer: PByte;
iReadCnt: Integer;
begin
DeleteFile(ParamStr(0) + '.old');
RenameFile(ParamStr(0), ParamStr(0) + '.old');
Screen.Cursor := crHourGlass;
try
sProgressBar1.Align := alClient;
sProgressBar1.Max :=DataSnapServer.ClientStreamSize;
Caption := 'درحال دانلود' + IntToStr(sProgressBar1.Max) + 'بایت ...';
sProgressBar1.Min := 0;
Stream := DataSnapServer.ClientStream;
Application.ProcessMessages;
FileStream := TFileStream.Create(ParamStr(0), fmCreate);
Stream.Position := 0;
try
GetMem(Buffer, iBuffSize);
try
repeat
iReadCnt := Stream.Read(Pointer(Buffer)^, iBuffSize);
sProgressBar1.Position := sProgressBar1.Position + iReadCnt;
if (iReadCnt > 0) then
FileStream.WriteBuffer(Pointer(Buffer)^, iReadCnt);
until (iReadCnt < iBuffSize);
finally
FreeMem(Buffer, iBuffSize);
end;
finally
Stream.Position := 0;
FreeAndNil(FileStream);
FreeAndNil(Stream);
end;
finally
Screen.Cursor := crDefault;
end;
ModalResult:=mrOk;
end;
حالا سوال من اینه که اگر فایل اجرایی 8 مگابایت باشه و پهنای باند ما 256 باشه آیا از این روش میشه برای آپدیت کردن استفاده کرد؟یا نه پهنای بیشتری میخواد؟یا نه اصلا روشش اصولی نیست؟
ممنون