PDA

View Full Version : چگونگی استفاده از ProgressBar در هنگام کپی فایل



ali_najari
جمعه 20 شهریور 1388, 01:03 صبح
سلام
کسی میدونه چطوری میتونم هنگامی که داره برنامه یه فایل رو کپی میکنه آن مقداری را که تا به حال کپی کرده را در ProgressBar نشان داد ؟

مثل خود ویندوز که کپی میکنه.

Saeed Hamed
جمعه 20 شهریور 1388, 03:13 صبح
کسی میدونه چطوری میتونم هنگامی که داره برنامه یه فایل رو کپی میکنه آن مقداری را که تا به حال کپی کرده را در ProgressBar نشان داد ؟


راه حل من برای کاری که شما میخواین انجام بدین اینه که بیاین فایل رو به صورت یک Streamبخونید و سپس در فایل یگه ای با استفاده از StreamWriter بنویسید که در پروسۀ این کار میشه مقدار ProgressBar رو با توجه به پیشرفت داشته تغییر داد.

ali_najari
شنبه 21 شهریور 1388, 11:27 صبح
ممکنه یکم بیشتر توضیح بدید؟
فرض کنید یه فایل اکسس را میخواید کپی کنید
چطور باید این کارو بکنم ؟

parsehvb
شنبه 21 شهریور 1388, 13:42 عصر
دوست عزیز
شما باید ابتدا معیاری رو برای اندازه گیری میزان پیشرفت کار مشخص یا تعریف نماید مثلاً حجم داده ها یا تعداد داده ها و ....
سپس در یک تایمر هر چند لحظه میزان پیشرفت کار رو اندازه گرفته و بنابر این اندازه ProgressBar خودتون رو تنظیم کنید

ArashRoshan
شنبه 21 شهریور 1388, 16:21 عصر
ببین این چطوره ، این با استفاده از خوده ویندوزه ، یا اینکه می خوای خودت یه فرم تازه برای کپی بسازی ؟
http://barnamenevis.org/forum/attachment.php?attachmentid=36266&d=1251792246

Saeed Hamed
شنبه 21 شهریور 1388, 17:44 عصر
ممکنه یکم بیشتر توضیح بدید؟
فرض کنید یه فایل اکسس را میخواید کپی کنید
چطور باید این کارو بکنم ؟

ببین دوست عزیز شما باید بخش بخش فایل رو به صورت باینری بخونی و به همون صورت نیز توی یک فایل دیگه ذخیره کنی و در مابین این خوندن ها و ذخیره کردن ها باید مقدار ProgressBar رو هم تغییر بدی. من یک نمونه کد برات میزارم توضیحاتشم در ادامش میدم امیدوارم مشکلت حل شه.



ProgressBar1.Value = 0
ProgressBar1.Maximum = 0
Dim openf AsNew OpenFileDialog
Dim savef AsNew SaveFileDialog
Dim FileSource AsString = ""
Dim NewFile AsString = ""
If openf.ShowDialog = Windows.Forms.DialogResult.OK Then
FileSource = openf.FileName
EndIf
If savef.ShowDialog = Windows.Forms.DialogResult.OK Then
NewFile = savef.FileName
EndIf
Dim f AsNew IO.FileStream(FileSource, IO.FileMode.Open, IO.FileAccess.Read)
Dim nf AsNew IO.FileStream(NewFile, IO.FileMode.OpenOrCreate, IO.FileAccess.Write)
Dim br AsNew IO.BinaryReader(f)
Dim bw AsNew IO.BinaryWriter(nf)
ProgressBar1.Maximum = f.Length
DoWhile br.BaseStream.Position < br.BaseStream.Length
bw.Write(br.ReadBytes(100))
ProgressBar1.Value = br.BaseStream.Position
Loop
f.Close()
nf.Close()
MsgBox("File Copy Finished!")


خوب ببین اینجا ما اومدیم اول به وسیلۀ یک OpenFileDialog مسیر فایل رو گرفتیم و سپس با استفاده از SaveFileDialog مسیر ذخیرۀ اونو مشخص کردیم.
قدم بعدی اینه که ما دوتا شیء Stream یکی برای خوندن و یکی برای نوشتن بسازیم که امیدوارم با اونا کار کرده باشی.
در مرحلۀ بعدی ما نیاز به دوتا شیء برای خوندن و نوشتن به صورت باینری داریم که اونا رو هم ایجاد می کنیم.
مقدار Maximum کنترل ProgreessBar رو برابر با طول فایلی که قراره کپی بشه قرار می دیم.
حالا داخل یک حلقه بایت ها را دسته دسته داخل فایل جدید مینویسیم و مقدار ProgressBar رو هم برابر نشانه گر فایلی که در حال خواندن است قرار می دهیم.
احنمالاً این نمونه کد با اون چیزی که شما مد نظرتون خیلی فاصله داره مثلاً توی این کد اگر حجم فایل زیاد باشه برنامه قفل می کنه و تا اتمام کپی آزاد نمیشه که برای حل این مشکل باید از یک Thread استفاده کنید.
موفق باشی. التماس دعا

ali_najari
یک شنبه 22 شهریور 1388, 11:09 صبح
سلام دوست عزیز
من اگه از Stream استفاده کنم سرعت انتقال داده ها خیلی میاد پایین

Saeed Hamed
دوشنبه 23 شهریور 1388, 02:50 صبح
سلام دوست عزیز
من اگه از Stream استفاده کنم سرعت انتقال داده ها خیلی میاد پایین
من فکر نکم که استفاده از Stream سرعت رو بگیره چون به هر حال خود سیستم عامل هم برای کپی یک فایل به ناچار باید همین پروسه رو انجام بده و فکر می کنم اگر سرعت انتقال پایین هستش باید شما الگوربتمی بنویسید که اگر حجم فایل زیاد بود تعداد بایت هایی که با یک دستور خوانده می شود رو نیز زیادتر کنید.
در نهایت باید خدمتتون عرض کنم تمامی مواردی که گفتم از منبع معتبری نبود و تماماً برداشت خودم هست و در اینکه آیا این کار اصولی است یا خیر باید شک کرد :چشمک:
به هر حال اگه دوستان راه بهتری دارن بد نیست که ما رو هم از علم به اون بی نصیب نزارن.

ali_najari
دوشنبه 23 شهریور 1388, 12:54 عصر
سلام
ممنون من از همین کد استفاده کردم و مشکلی هم فعلا ندارم با سرعت چون تعداد بایت های فراخونی شده را بیشتر کردم