الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكله في نقل الملفات

بدأه super_rio في 17 فبراير 2008 · 4 رد · 852 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

انا اعمل علي برنامج لينقل الملفات من كلينت لسيرفر لكلينت

ولكن الان اعمل علي مثال بسيط فقط وهو النقل من كلينت لسيرفر وحفظ الملف في السيرفر

ولكن عندي مشكله الا وهي انا اذا ارسلت اكتر من ملف اخر ملف فقط هو الذي يصل كاملا اما الباقي فلا يكتمل ولا اعرف ما السبب مع اني لو ارسلت ملف واحد فقط يصل كامل و سليم

  type
	   TMASTER = record
		  used:bool;
		  sock: integer;
		  fs: tfilestream;
		  NAME_FILE:STRING;
		  fSIZE:INTEGER;
	 end;

اولا صنعت ريكود ليحتوي بعض المعلومات مثل اسم الملف وحجمه ووضعت متغير في البدايه لكي اعرف اذا كان هذا الريكورد مستخدم ام لا

متغير من نوع انتجر ليخزن السوكت هاندل

فايل ستريم استريم ليكتب في الملف

سترنج للاسم و انتجر للحجم

	   sr_file: array [0..5]of TMASTER;

هنا صنعت مصفوفه من الريكورد

procedure TForm2.ServerClientRead(Sender: TObject;
  Socket: TCustomWinSocket);

  var
 buf:string;
MsgLen,
  ReceiveLen
  ,n,i ,sockhand
  :integer;
 // bSkip: boolean;
 label
 streamcreation;
begin
sockhand:=Socket.SocketHandle;
  MsgLen:=Socket.ReceiveLength;
  SetLength(buf,MsgLen);
  ReceiveLen:=Socket.ReceiveBuf(buf[1],MsgLen);
  buf:=copy(buf,1,ReceiveLen);

if pos('<FILEONWAY>',buf) = 1 then
 begin
delete(buf,1,11);
NAME_FILE:=copy(buf,1,pos('|',buf)-1);
delete(buf,1,pos('|',buf));
fSIZE:=STRTOINT(copy(buf,1,pos('|',buf)-1));
delete(buf,1,pos('|',buf));
Updatetrans(Socket.RemoteAddress, inttostr(sockhand),NAME_FILE,INTTOSTR(fSIZE),0);
Memo1.Lines.Add(buf);


for n :=0 to 5 do
   if sr_file[n].used = false then goto streamcreation else begin showmessage('to many streams'); exit; end;

streamcreation:
begin
  sr_file[n].sock:=sockhand;
  sr_file[n].Fs:=TFileStream.Create(ExtractFileName(NAME_FILE),fmcreAte or fmOpenWrite);
  sr_file[n].NAME_FILE:=ExtractFileName(NAME_FILE);
  sr_file[n].fSIZE:=fSIZE;

 end;
  end;
	 Memo1.Lines.Add(buf+inttostr(length(Buf)));


try
for i :=0 to 5 do
if sr_file.sock =sockhand then
begin
Updatetrans(Socket.RemoteAddress, inttostr(sockhand),'','',length(buf));

sr_file.FS.Write(Buf[1], length(Buf)); {4}
dec(sr_file.fSize,length(buf));
 if sr_file.fSIZE =0 then
 begin
  sr_file.used:=false;
  sr_file.sock:=0;
  sr_file.fs.Free;
	sr_file.NAME_FILE:='';
	  sr_file.fSIZE:=0;
  end;
  end;
except
 Memo1.Lines.Add('Error writing file.'); end;



end;

هناك 2loop

واحده لتجد ريكورد خالي ليضع فيه البيانات

والثانيه لكي يجد الريكورد المطلوب و الذي كون مسبقا عند ارسال البيانات من سوكت معينه

#2

هناك طريقه نصحني بها بعض الافراض و هي استخدام ادوات الاندي و استخدام الملتيثريد multithread

هل هناك اي افكار

#3

السلام عليكم

اخي العزبز لما لا تنقل الملفات بواسطة تعليمات بسيطة من والى السرفر بمعرفة IP فقط و المسار طبعا

CopyFile('\\10.12.12.33\c$\zekiri.txt','\\10.12.12.01\d$\zekiri.txt)
#4

هذا الكود ساستخدمه في برنامج شات يعمل عبر الwan وليس الlan ولا اظن ان فكره حضرتك سوف تجدي

عبر الwan

#5

ايه يا شباب فين الحلول

طب في حد عنده مثال علي الملتي ثريد بتاع الاندي

مواضيع مشابهة