نسخ ملف والتاكد من تطابق الملف الاصلى والمنسوخ
#1
السلام عليكم
نسخ ملف والتاكد من تطابق الملف الاصلى والمنسوخ
من الممكن ان نحتاج الى نسخ ملف من مكان الى مكان اخر على القرص الصلب او حتى على الفلاش ديسك
وممكن ان تكون هذه الملفات ذات اهمية كبيرة مثلا ملف قاعدة بيانات نقوم بعمل نسخة احطياطية منه بشكل يدوى
مبدئيا عملية النسخ سهل للغاية فسوف نعتمد على ال TfileStream واستخدامه فى غاية البساطة كما سنرى

سوف نحتاج الى تعريف عدد 2 كائن من النوع TfileStream

كود :
var
mySourceFS : TFileStream;
myDestFs : TFileStream;

الstream الاول خاص بالملف الاصل
الاستريم التانى خاص بالملف الذى سوف ننشئه
كود :
mySourceFS := TFileStream.Create('source file name', fmOpenRead or fmShareDenyRead);

لاحظ اننا فتحنا الملف للقراءة ومنع اى برنامج اخر من الوصول اليه وقت التعامل معه fmOpenRead or fmShareDenyRead

كود :
myDestFs := TFileStream.Create('target file name',fmCreate or fmOpenWrite );

لاحظ اننا سوف ننشئ الملف ان لم يكن موجود او اننا سنفتحه للكتابة fmCreate or fmOpenWrite

الان عملية النسخ فى منتهى البساطة "Delphi is RAD"
كود :
mySourceFS.Position := 0;
    myDestFs.CopyFrom(mySourceFS,mySourceFS.Size);

===
تمت عملية النسخ بنجاح
ولكن نريد ان نتاكد ان الملفين متطابقين
سوف نلجأ الى الMD5 hash
كل ملف له md5hash فريد خاص به عند التغير على الملف يتغير هذا الmd5hash
سوف نستخدم اليونت IdHashMessageDigest من مشروع Indy
كود :
uses IdHashMessageDigest;
اول شئ نقوم بتعريف الكائن myMD5Hasher من النوع TIdHashMessageDigest5
كود :
var
myMD5Hasher : TIdHashMessageDigest5;
ثم ننشئ هذا الكائن
myMD5Hasher := TIdHashMessageDigest5.Create;

نعرف متغيرين من النوع string ليكون الاول هو الhash الخاص بالملف الاصل والتانى بالملف المنسوخ اليه "الجديد او الtarget"
كود :
var
SourceFileHash : string;
DestFileHash : string;

الان نحاول الحصول على الهاش الخاص بالملف الاصلى باستخدام الدالة HashStreamAsHex الخاصة بالكائن TIdHashMessageDigest5

واستدعائها كالاتى
كود :
SourceFileHash := myMD5Hasher.HashStreamAsHex(mySourceFS, 0, mySourceFS.Size);
و
كود :
DestFileHash := myMD5Hasher.HashStreamAsHex(myDestFs, 0, myDestFs.Size);

الان نقوم بمقارنة كل من SourceFileHash و DestFileHash
وذلك كالاتى

كود :
if SourceFileHash = DestFileHash then
    begin
      ShowMessage('Both files has the same file hash : '+SourceFileHash);
    end
    else
    begin
     ShowMessage('Files have different hashs source : '+SourceFileHash+' dist : '+DestFileHash);
    end;

كم كانت الفكرة بسيطة جدا
الان يكون الكود كله كالاتى
نضع على الفورم opendialog و savedialog و button

ويكون الكود فى الحدث onclick الخاص بالbutton كالاتى
PHP كود :
uses IdHashMessageDigest;
procedure TForm1.Button2Click(SenderTObject);
var
 
mySourceFS TFileStream;
 
myDestFs TFileStream;
 
myMD5Hasher TIdHashMessageDigest5//IdHashMessageDigest
 
SourceFileHash string;
 
DestFileHash string;
begin
 
if OpenDialog1.Execute then
 begin
   mySourceFS 
:= TFileStream.Create(OpenDialog1.FileNamefmOpenRead or fmShareDenyRead);
 
  myMD5Hasher := TIdHashMessageDigest5.Create;
 
  SourceFileHash := myMD5Hasher.HashStreamAsHex(mySourceFS0mySourceFS.Size);
 
end;
 if 
SaveDialog1.Execute then
 begin
   myDestFs 
:= TFileStream.Create(SaveDialog1.FileName,fmCreate or fmOpenWrite );
 
  try
 
    mySourceFS.Position := 0;
 
    myDestFs.CopyFrom(mySourceFS,mySourceFS.Size);
 
    DestFileHash := myMD5Hasher.HashStreamAsHex(myDestFs0myDestFs.Size);
 
    if SourceFileHash DestFileHash then
     begin
       ShowMessage
('Both files has the same file hash : '+SourceFileHash);
 
    end
     
else
 
    begin
      ShowMessage
('Files have different hashs source : '+SourceFileHash+' dist : '+DestFileHash);
 
    end;
 
  finally
 
     mySourceFS.Free;
 
     myDestFs.Free;
 
     myMD5Hasher.Free;
 
  end;
 
end;
end
هذا كل شئ والسلام عليكم ورحمة الله وبركاته
اللهم انر قبر ابى واجعل مثواه الجنة
[-] كل من 5 users say قال شكرا ل justnick على المشاركة المفيدة
  • bassem_43, h-farid, mohamed49, wadoud, لؤي
الرد


التنقل السريع :


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف