Merhaba Arkadaşlar.Bu projede Progressbar kullanılarak Server'dan Client'e sağlıklı
bir şekilde nasıl dosya gönderileceğini yolluyorum.Dosya gönderme konusunda birçok örnek var ama sanırım en güzeli bu örnek.Hiçbir şekilde veri kaybına yol açmıyor.Kodu ben kendime göre dizayn ettim.Siz dilediğiniz gibi kullanabilirsiniz...
// unreachableboy : unreachableboy@hotmail.com //
Gerekli Unit'i veriyorum
// PublicUnit Başlangıcı *********************
unit PublicUnit;
interface
uses
Windows;
type
TClientStatus = (csCheck, csSend);
TServerStatus = (ssFileNotFound, ssSending, ssReady);
TFileName = array [0..Max_Path] of Char;
implementation
end.
// PublicUnit Sonu *************************
Bu Uniti "PublicUnit.pas" olacak şekilde oluşturun.Client ve Server Projelerinizin olduğu dizinlere kopyalayın.
// Server Kodu Başlangıcı ***************************
private
{ Private declarations }
procedure SendFile(S: string; Socket: TCustomWinSocket);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
Uses PublicUnit;
{$R *.dfm}
procedure TForm1.SendFile(S: string; Socket: TCustomWinSocket);
var
FileStream: TFileStream;
ServerStatus: TServerStatus;
Boyut: Int64;
Buffer: array [0..2047] of Char;
Okunan, Gonderilen: integer;
begin
FileStream:=TFileStream.Create(S, fmOpenRead or fmShareDenyNone);
try
ServerStatus:=ssSending;
Socket.SendBuf(ServerStatus, Sizeof(ServerStatus));
Boyut:=FileStream.Size;
Socket.SendBuf(Boyut, Sizeof(Boyut));
FileStream.Position:=0;
repeat
Okunan:=FileStream.Read(Buffer, Sizeof(Buffer));
repeat
Gonderilen:=Socket.SendBuf(Buffer, Okunan);
until (Gonderilen <> -1) or not Socket.Connected;
Application.ProcessMessages;
until
(FileStream.Position = FileStream.Size) or not Socket.Connected;
finally
FileStream.Free;
end;
end;
procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
P: PChar;
ClientStatus: TClientStatus;
ServerStatus: TServerStatus;
FileName: TFileName;
begin
if Socket.ReceiveLength < Sizeof(ClientStatus) then Exit;
Socket.ReceiveBuf(ClientStatus, Sizeof(ClientStatus));
case ClientStatus of
csCheck:
begin
while Socket.ReceiveLength < Sizeof(FileName) do;
Socket.ReceiveBuf(FileName, Sizeof(FileName));
P:=@FileName[0];
if FileExists(P) then ServerStatus:=ssReady
else begin
ServerStatus:=ssFileNotFound;
end;
Socket.SendBuf(ServerStatus, Sizeof(ServerStatus));
end;
csSend:
begin
while Socket.ReceiveLength < Sizeof(FileName) do;
Socket.ReceiveBuf(FileName, Sizeof(FileName));
P:=@FileName[0];
SendFile(P, Socket);
end;
end;
end;
// Server Kodu Sonu ************************
// Client Kodu Başlangıcı ****************************
private
{ Private declarations }
procedure Gonder(var Buf; len: integer);
public
{ Public declarations }
end;
var
Form1: TForm1;
Adres: string;
ClientStatus: TClientStatus;
ServerStatus: TServerStatus;
FileName: TFileName;
Dosya,dosyaadi: string;
FileStream: TFileStream;
Boyut: Int64;
Okunuyor: Boolean;
implementation
Uses PublicUnit;
{$R *.dfm}
procedure TForm1.Gonder(var Buf; len: integer);
begin
if ClientSocket1.Active then ClientSocket1.Socket.SendBuf(Buf, len);
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Dosya:=StrPas(@FileName[0]);
Dosya := 'C:\kaynakdosya.exe'; // Bu dosya yüklenecek olan dosya
Dosya:=Trim(Dosya);
if Dosya = '' then begin
Exit;
end;
ClientStatus:=csCheck;
FillChar(FileName, Sizeof(FileName), 0);
Move(Dosya[1], FileName[0], Length(Dosya));
Gonder(ClientStatus, Sizeof(ClientStatus));
Gonder(FileName, Sizeof(FileName));
end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Okunuyor then begin
FileStream.Free;
Okunuyor:=False;
end;
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
Buffer: array [0..2047] of Char;
Okunan, i: integer;
S,ss: string;
begin
if Okunuyor then begin
Okunan:=Socket.ReceiveBuf(Buffer, Sizeof(Buffer));
if Okunan > 0 then FileStream.WriteBuffer(Buffer, Okunan);
i:=Round(FileStream.Position / Boyut * 100);
if ProgressBar1.Position <> i then ProgressBar1.Position:=i;
S:=InttoStr(i) + '% tamamlandı';
if FileStream.Size >= Boyut then begin
Okunuyor:=False;
FileStream.Free;
ClientSocket1.Active:=False;
end;
Exit;
end;
while Socket.ReceiveLength < Sizeof(ServerStatus) do;
Socket.ReceiveBuf(ServerStatus, Sizeof(ServerStatus));
case ServerStatus of
ssFileNotFound:
begin
end;
ssReady:
begin
ss:=ExtractFileName(Dosya);
ClientStatus:=csSend;
Gonder(ClientStatus, Sizeof(ClientStatus));
Gonder(FileName, Sizeof(FileName));
ss:='C:\hedefdosya.exe'; // Yüklenen dosyanın nereye kaydedileceği burada
Dosya:=ss;
if FileExists(Dosya) then DeleteFile(Dosya);
end;
ssSending:
begin
while Socket.ReceiveLength < Sizeof(Int64) do;
Socket.ReceiveBuf(Boyut, Sizeof(Boyut));
FileStream:=TFileStream.Create(Dosya, fmCreate);
FileStream.Position:=0;
Okunuyor:=True;
end;
end;
end;
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ClientSocket1.Active:=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Interval:=1;
Timer1.Enabled:=False;
end;
// Client Kodu Sonu ****************************