- tarik
- عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
كيفية نسخ ملف مع ظهور عملية النسخ في Progressbar
الثلاثاء أكتوبر 09, 2012 8:38 am
السلام عليكم ورحمة الله وبركاته (الموضوع منقول )
أقدم لكم هذا الدرس البسيط الذي قمت بترجمة معظم محتوياته من أحد المواقع على الإنترنت فعلى بركة الله نبدأ
اليوم سأقدم لكم تحكماً لنسخ الملف بحيث يظهر تقدم عملية النسخ في Progressbar .
في البداية سيتم الإعلان عن دوال API كما يلي:
ملاحظة : كن متأكداً عند تجربة هذا الكود بأن الملف المراد نسخه موجود فعلاً (ملف المصدر) ، وإن كنت أقترح أن تجربه على ملف كبير (أكبر من 100 ميغا) لترى كيف تظهر النتيجة في Progressbar .
تعيد الدالة CopyFileEx قيمة مغايرة عن الصفر في حال نجاح العملية وإلا ستعود بقيمة الصفر ، وعيه يمكننا كتابة كود النسخ بالشكل التالي :
من خلال الكود السابق كانت العملية تتم حتى لو كان الملف الهدف موجوداً بحد ذاته ، بمعنى أن الكود سيقوم باستبدال الملف الهدف (إن كان موجوداً) بالملف الجديد.
إن كنت تود الاحتفاظ بالملف القديم (إلغاء خاصية Overwrite) فما عليك سوى تبديل المتغير الأخير المطلوب في عملية النسخ إلى الرقم 1 بحيث يصبح بالشكل التالي:
وبذلك يكون كود زر الأوامر لنسخ الملف مع إظهاره في Progressbar بالشكل التالي :
أقدم لكم هذا الدرس البسيط الذي قمت بترجمة معظم محتوياته من أحد المواقع على الإنترنت فعلى بركة الله نبدأ
اليوم سأقدم لكم تحكماً لنسخ الملف بحيث يظهر تقدم عملية النسخ في 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
- الكود:
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
- الكود:
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
ملاحظة : كن متأكداً عند تجربة هذا الكود بأن الملف المراد نسخه موجود فعلاً (ملف المصدر) ، وإن كنت أقترح أن تجربه على ملف كبير (أكبر من 100 ميغا) لترى كيف تظهر النتيجة في Progressbar .
تعيد الدالة CopyFileEx قيمة مغايرة عن الصفر في حال نجاح العملية وإلا ستعود بقيمة الصفر ، وعيه يمكننا كتابة كود النسخ بالشكل التالي :
- الكود:
Dim Result As Integer
Result = CopyFileEx("C:\1.dll", "C:\2.dll", cpr, 0, 0, 0)
من خلال الكود السابق كانت العملية تتم حتى لو كان الملف الهدف موجوداً بحد ذاته ، بمعنى أن الكود سيقوم باستبدال الملف الهدف (إن كان موجوداً) بالملف الجديد.
إن كنت تود الاحتفاظ بالملف القديم (إلغاء خاصية 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
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى