شاطر
اذهب الى الأسفل
عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
معاينة صفحة البيانات الشخصي للعضو

كيفية نسخ ملف مع ظهور عملية النسخ في Progressbar

في الثلاثاء أكتوبر 09, 2012 8:38 am
السلام عليكم ورحمة الله وبركاته (الموضوع منقول )

أقدم لكم هذا الدرس البسيط الذي قمت بترجمة معظم محتوياته من أحد المواقع على الإنترنت فعلى بركة الله نبدأ

اليوم سأقدم لكم تحكماً لنسخ الملف بحيث يظهر تقدم عملية النسخ في Progressbar .
في البداية سيتم الإعلان عن دوال API كما يلي:

الكود:

Private Delegate Function CopyProgressRoutine(ByVal totalFileSize As Int64, _
ByVal totalBytesTransferred As Int64, ByVal streamSize As Int64, _
ByVal streamBytesTransferred As Int64, ByVal dwStreamNumber As Int32, _
ByVal dwCallbackReason As Int32, ByVal hSourceFile As Int32, _
ByVal hDestinationFile As Int32, ByVal lpData As Int32) As Int32

Private Declare Auto Function CopyFileEx Lib "kernel32.dll" _
(ByVal lpExistingFileName As String, ByVal lpNewFileName As String, _
ByVal lpProgressRoutine As CopyProgressRoutine, _
ByVal lpData As Int32, ByVal lpBool As Int32, ByVal dwCopyFlags As Int32) As Int32
قم بإضافة زر أوامر Button1 للـ Form وأضف الكود التالي في حدث النقر:

الكود:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim cpr As New CopyProgressRoutine(AddressOf CopyProgress)
CopyFileEx("C:\1.dll", "C:\2.dll", cpr, 0, 0, 0)
End Sub
أضف أداة ProgressBar إلى الـ Form واكتب الكود التالي Function :

الكود:

Private Function CopyProgress(ByVal totalFileSize As Int64, _
ByVal totalBytesTransferred As Int64, ByVal streamSize As Int64, _
ByVal streamBytesTransferred As Int64, ByVal dwStreamNumber As Int32, _
ByVal dwCallbackReason As Int32, ByVal hSourceFile As Int32, _
ByVal hDestinationFile As Int32, ByVal lpData As Int32) As Int32
ProgressBar1.Value = Convert.ToInt32(TotalBytesTransferred / TotalFileSize * 100)
End Function
اضغط على زر الأوامر Button1 ولاحظ النتيجة.
ملاحظة : كن متأكداً عند تجربة هذا الكود بأن الملف المراد نسخه موجود فعلاً (ملف المصدر) ، وإن كنت أقترح أن تجربه على ملف كبير (أكبر من 100 ميغا) لترى كيف تظهر النتيجة في Progressbar .
تعيد الدالة CopyFileEx قيمة مغايرة عن الصفر في حال نجاح العملية وإلا ستعود بقيمة الصفر ، وعيه يمكننا كتابة كود النسخ بالشكل التالي :

الكود:

Dim Result As Integer
Result = CopyFileEx("C:\1.dll", "C:\2.dll", cpr, 0, 0, 0)
فإذا كانت قيمة Result مغايرة للصفر فالعملية تمت بنجاح.
من خلال الكود السابق كانت العملية تتم حتى لو كان الملف الهدف موجوداً بحد ذاته ، بمعنى أن الكود سيقوم باستبدال الملف الهدف (إن كان موجوداً) بالملف الجديد.
إن كنت تود الاحتفاظ بالملف القديم (إلغاء خاصية Overwrite) فما عليك سوى تبديل المتغير الأخير المطلوب في عملية النسخ إلى الرقم 1 بحيث يصبح بالشكل التالي:

الكود:

CopyFileEx("C:\1.dll", "C:\2.dll", cpr, 0, 0, 1)
ولكن هنالك مشكلة أخرى ، وهي أن العملية ستفشل إن كان ملف الهدف موجوداً ومخفي أو كان للقراءة فقط وعليه يجب تبديل خصائصه إلى الخصائص العادية كما يلي:

الكود:

Dim fi As New System.IO.FileInfo("C:\2.dll")
If fi.Exists Then
fi.Attributes = IO.FileAttributes.Normal
End If
قد يسأل سائل ويقترح بأن نقوم بحذف الملف الهدف قبل النسخ ولا داعي لتبديل خصائصه ، وأنا هنا لا أحبذ تلك الطريقة لسبب واحد وهو أنه من الممكن بعد حذف الملف أن تفشل عملية النسخ لسبب ما ، وبذلك يكون ملف الهدف قد ضاع دون فائدة .
وبذلك يكون كود زر الأوامر لنسخ الملف مع إظهاره في Progressbar بالشكل التالي :

الكود:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim cpr As New CopyProgressRoutine(AddressOf CopyProgress)
Dim Result As Integer
Dim fi As New System.IO.FileInfo("C:\2.dll")
If fi.Exists Then
fi.Attributes = IO.FileAttributes.Normal
End If
Result = CopyFileEx("C:\1.dll", "C:\2.dll", cpr, 0, 0, 0)
'استبدل السطر التالي بالسطر السابق لإيقاف Overwrite
'Result = CopyFileEx("C:\1.dll", "C:\2.dll", cpr, 0, 0, 1)
If Result = 0 Then
MsgBox("فشلت عملية النسخ")
Else
MsgBox("تمت عملية النسخ بنجاح")
End If
End Sub
بالطبع هذه العملية من الممكن أن تطور بأكثر من اتجاه ، حيث أن تطبيقاتها عديدة (وأنا أقوم الآن بأحد هذه التطبيقات لعمل Backup لملفاتي الخاصة على جهازي Internal Backup وعلى جهاز السيرفر من خلال الشبكة External Backup
الرجوع الى أعلى الصفحة
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى