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

عمل Progress Bar لاستخدامها في نسخ الملفات

بدأه shdelpiero في 4 أبريل 2008 · 2 رد · 896 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اريد عمل progress bar يتناسب مع دالة تقوم بعمل copy لملف من مكان الى اخر

انا أعلم انه لايمكن التنبؤ بوقت انتهاء عملية النسخ , ولكن أرجوا المساعدة

انا عملت بحث في المنتدى وفي معظم المواقع ولم أجد معلومة تفيدني في هذا الموضوع

غير اني قرات للاخ المتألق فادي عبدالقادر هذا التعليق

" يمكنك معرفة حجم العملية مثلا قراءة بيانات معينة من Stream فيعرف في البداية حجم ال Stream بستخدام الخاصية Length ثم يقسم على 100 ويتم الزيادة في البروجرس بار بناء على الزيادة في حجم المصفوفة والتي تستقبل ال Stream .. ويوجد عدة طرق وعدة حلول يمكنك ابتكارها لكن كما قال اخي معتز لايمكنك في الكثير من الحالات التنبأ بحجم العملية التي تود اجرائها .."

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

فهل من مساعدة؟

وجزاكم الله خيرا

#2
namespace IO
{
	using System;
	using System.Runtime.InteropServices;

	public delegate void CopyProgressCallBack(int Percentage);

	public class File
	{
		enum CopyProgressResult : uint
		{
			Continue	= 0,
			Cancel	  = 1,
			Stop		= 2,
			Quiet	   = 3
		}

		enum CopyProgressCallbackReason : uint
		{
			Chunk_Finished   = 0x00000000,
			Stream_Switch	= 0x00000001
		}

		[Flags]
		enum CopyFileFlags : uint
		{ 
			Fail_If_Exists			   = 0x00000001,
			RestartAble				  = 0x00000002,
			Open_Source_For_Write		= 0x00000004,
			Allow_Decrypted_Destination  = 0x00000008
		}


		[UnmanagedFunctionPointer(CallingConvention.StdCall)]
		private delegate CopyProgressResult CopyProgressRoutine(long totalFileSize,
																long bytesTransfered,
																long streamSize,
																long streamBytesTransfered,
																uint streamNumber,
																CopyProgressCallbackReason callbackReason,
																IntPtr hSourceFile,
																IntPtr hDestinationFile,
																IntPtr lpData);

		[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
		[return: MarshalAs(UnmanagedType.Bool)]
		private static extern bool CopyFileEx(  string lpExistingFileName,
												string lpNewFileName,
												[MarshalAs(UnmanagedType.FunctionPtr)] 
												CopyProgressRoutine lpProgressRoutine,
												IntPtr lpData,
												ref bool pbCancel,
												CopyFileFlags dwCopyFlags);

		public static void Copy(string sourceFile, string destinationFile, CopyProgressCallBack callBack)
		{
			if(System.IO.File.Exists(sourceFile) && (!string.IsNullOrEmpty(destinationFile))) {
				try {
					bool pbCancel = false;
					CopyFileEx(
						sourceFile, destinationFile,
						delegate(long totalFileSize, 
								 long bytesTransfered, 
								 long streamSize, 
								 long streamBytesTransfered, 
								 uint streamNumber, 
								 CopyProgressCallbackReason callbackReason, 
								 IntPtr hSourceFile, 
								 IntPtr hDestinationFile, 
								 IntPtr lpData)
						{
							callBack.Invoke((int)(((double)bytesTransfered / (double)totalFileSize) * 100));
							return CopyProgressResult.Continue;
						},
						IntPtr.Zero, ref pbCancel, CopyFileFlags.RestartAble);
				} catch(Exception e) {
					throw new Exception(e.Message);
				}
			}
		}
	}
}

Call

private void btnStart_Click(object sender, EventArgs e)
{
	File.Copy(txtSrc.Text, txtDest.Text, 
		delegate(int percentage) {
			progressBar1.Value = percentage;
			Text = string.Format("{0}% Transferred.", percentage);
			if(percentage == 100)
				btnStart.Enabled = true;
			else
				btnStart.Enabled = false;
		}
	);
}

مواضيع متنوعة

#3

ماشاء الله عليك اخونا مودى وربى يحرسك

والف شكر على المعلومة

تلميذك Rashadov

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