السلام عليكم
نسخ ملف والتاكد من تطابق الملف الاصلى والمنسوخ
من الممكن ان نحتاج الى نسخ ملف من مكان الى مكان اخر على القرص الصلب او حتى على الفلاش ديسك
وممكن ان تكون هذه الملفات ذات اهمية كبيرة مثلا ملف قاعدة بيانات نقوم بعمل نسخة احطياطية منه بشكل يدوى
مبدئيا عملية النسخ سهل للغاية فسوف نعتمد على ال TfileStream واستخدامه فى غاية البساطة كما سنرى
سوف نحتاج الى تعريف عدد 2 كائن من النوع TfileStream
الstream الاول خاص بالملف الاصل
الاستريم التانى خاص بالملف الذى سوف ننشئه
لاحظ اننا فتحنا الملف للقراءة ومنع اى برنامج اخر من الوصول اليه وقت التعامل معه fmOpenRead or fmShareDenyRead
لاحظ اننا سوف ننشئ الملف ان لم يكن موجود او اننا سنفتحه للكتابة fmCreate or fmOpenWrite
الان عملية النسخ فى منتهى البساطة "Delphi is RAD"
===
تمت عملية النسخ بنجاح
ولكن نريد ان نتاكد ان الملفين متطابقين
سوف نلجأ الى الMD5 hash
كل ملف له md5hash فريد خاص به عند التغير على الملف يتغير هذا الmd5hash
سوف نستخدم اليونت IdHashMessageDigest من مشروع Indy
اول شئ نقوم بتعريف الكائن myMD5Hasher من النوع TIdHashMessageDigest5
ثم ننشئ هذا الكائن
myMD5Hasher := TIdHashMessageDigest5.Create;
نعرف متغيرين من النوع string ليكون الاول هو الhash الخاص بالملف الاصل والتانى بالملف المنسوخ اليه "الجديد او الtarget"
الان نحاول الحصول على الهاش الخاص بالملف الاصلى باستخدام الدالة HashStreamAsHex الخاصة بالكائن TIdHashMessageDigest5
واستدعائها كالاتى
و
الان نقوم بمقارنة كل من SourceFileHash و DestFileHash
وذلك كالاتى
كم كانت الفكرة بسيطة جدا
الان يكون الكود كله كالاتى
نضع على الفورم opendialog و savedialog و button
ويكون الكود فى الحدث onclick الخاص بالbutton كالاتى
هذا كل شئ والسلام عليكم ورحمة الله وبركاته
اللهم انر قبر ابى واجعل مثواه الجنة
نسخ ملف والتاكد من تطابق الملف الاصلى والمنسوخ
من الممكن ان نحتاج الى نسخ ملف من مكان الى مكان اخر على القرص الصلب او حتى على الفلاش ديسك
وممكن ان تكون هذه الملفات ذات اهمية كبيرة مثلا ملف قاعدة بيانات نقوم بعمل نسخة احطياطية منه بشكل يدوى
مبدئيا عملية النسخ سهل للغاية فسوف نعتمد على ال 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;
كود :
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(Sender: TObject);
var
mySourceFS : TFileStream;
myDestFs : TFileStream;
myMD5Hasher : TIdHashMessageDigest5; //IdHashMessageDigest
SourceFileHash : string;
DestFileHash : string;
begin
if OpenDialog1.Execute then
begin
mySourceFS := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyRead);
myMD5Hasher := TIdHashMessageDigest5.Create;
SourceFileHash := myMD5Hasher.HashStreamAsHex(mySourceFS, 0, mySourceFS.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(myDestFs, 0, myDestFs.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;
اللهم انر قبر ابى واجعل مثواه الجنة