PDA

View Full Version : سوال: چگونگی اطلاع از اتمام عمل کپی



mostafaVB
دوشنبه 10 شهریور 1393, 16:40 عصر
دوستان سلام
من برنامه ای نوشتم که فایلها و فولدرها را از مکانی به مکان دیگه کپی می کنه.
ولی مشکل اینجاست که من میخوام وقتی عمل کپی کردن تموم شد به کاربر پیغام بدم که کپی کردن تموم شد. :متفکر:
چطور می تونم این کار رو انجام بدم.
با تشکر

vbhamed
سه شنبه 11 شهریور 1393, 08:56 صبح
سلام
چطوري و با چه روشي كپي مي‌كنيد ؟

mostafaVB
سه شنبه 11 شهریور 1393, 14:56 عصر
من با FSO کپی میکنم.

vbhamed
سه شنبه 11 شهریور 1393, 17:54 عصر
سلام
خب fso تا وقتي كارش تموم نشه نميزاره برنامه ادامه پيدا كنه، وقتي هم تموم شد مي‌تونيد پيام رو نشون بديد

mostafaVB
سه شنبه 11 شهریور 1393, 20:17 عصر
آخه وقتی عمل کپی انجام میشه برنامه به حالت هنگ میره.چطور میتونم یه کاری کنم که کلاً ویندوز هنگ نکنه؟از دستور DoEvent هم استفاده کردم.
با تابع CopyFile میشه این کار رو انجام داد به طوری که عمل کپی را برابر مثلاً a قرار بدیم و بگیم اگه a>0 بود اونوقت به کاربر پیغام بده ولی اولاً هر کاری کردم نتونستم با FSO این کار رو انجام بدم.ثاتیاً تابع CopyFile نمیتونه فولدر رو کپی کنه.
در ضمن چطور میشه هنگام عمل کپی از Progressbar برای پیشرفت کار استفاده کنم درست مثل کاری که شما توی برنامه دفترچه تلفنی که ساختید عمل کنه.
ببخشید که این همه سوال می پرسم.
با تشکر از توجهتون به این تاپیک.

vbhamed
چهارشنبه 12 شهریور 1393, 09:31 صبح
سلام

اول اينكه احتمالا منظورتون تابع FileCopy داخلي VB6 هست نه CopyFile
دوم اينكه اين تابع هم تا كپي انجام نشه صبر مي‌كنه

براي كپي پوشه هم Fso تابع CopyFolder رو داره

اما كلا براي اينكه ظاهرا هنگ نكنه و نوار پيشرفت هم نمايش بديد دو تا راه داريد

1 - با استفاده از Api از خود ويندوز براي كپي استفاده كنيد مثل حالتي كه روي فايلي Ctrl+C مي‌زنيم و بعدش Ctrl+V، كه اينطوري هيچ كنترلي ديگه دست شما نيست و خيلي توصيه نميشه

2 - خودتون با استفاده از دستورات كار كردن با فايل ويژوال بيسيك تابع كپي رو شبيه سازي كنيد، كارتون خيلي مشكلتر ميشه ولي ديگه همه چي دست خودتونه حتي مي‌تونيد وسط كپي اون رو متوقف كنيد و بعد ادامه بديد
به دستورات Open, Get, Put, Dir و ... مراجعه كنيد، البته تو گوگل هم عبارت Copy with progress in vb6 سرچ كنيد چيزهاي خوبي پيدا مي‌كنيد

ایلیا آخوندزاده
چهارشنبه 12 شهریور 1393, 09:55 صبح
سلام آقای VBhamed
منظور دوست عزیزمون درست بود تابع copyfile هست که در ماژول با copyfileA هم تعریف میشه. من خودم با این روش برای نسخه پشتیبان از دیتابیس با فرمت backup استفاده میکنم ولی این تابع امکان کپی کردن فولدر رو نداره.
این هم نمونه البته ببخشید ها شما خودتون استادید و مطمئنا این روش رو میدونید.

mostafaVB
پنج شنبه 13 شهریور 1393, 07:03 صبح
با سلام
من توی گشت و گذار توی اینترنت به این کد رسیدم که انجام کپی رو با Progressbar نشون میده و برنامه هم اصلاً هنگ نمی کنه.
ولی مشکل اینجاست که این فقط برای کپی فایل هست و نمیشه با اون فولدر رو کپی کرد.
اگه میشه یه نمونه مثل این برای کپی فولدر قرار بدید.
با تشکر

اول این کدها رو توی ماژول می نویسیم:

Public Declare Function CopyFileEx Lib "kernel32.dll" Alias "CopyFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal lpProgressRoutine As Long, lpData As Any, ByRef pbCancel As Long, ByVal dwCopyFlags As Long) As LongPublic Const COPY_FILE_FAIL_IF_EXISTS = &H1
Public Const COPY_FILE_RESTARTABLE = &H2
Public bCancel As Long
Public Function CopyProgressRoutine(ByVal TotalFileSize As Currency, ByVal TotalBytesTransferred As Currency, ByVal StreamSize As Currency, ByVal StreamBytesTransferred As Currency, ByVal dwStreamNumber As Long, ByVal dwCallbackReason As Long, ByVal hSourceFile As Long, ByVal hDestinationFile As Long, ByVal lpData As Long) As Long
On Error Resume Next
Form1.ProgressBar1.Value = CStr(Int((TotalBytesTransferred * 10000) / (TotalFileSize * 10000) * 100))
DoEvents
CopyProgressRoutine = PROGRESS_CONTINUE
End Function

بعد یک فرم باز می کنیم و روی اون یک Progressbar قرار میدیم و این کد رو توی خاصیت کلیک دکمه کپی می نویسیم:

ret = CopyFileEx("from" , "to" , AddressOf CopyProgressRoutine, ByVal 1&, bCancel, COPY_FILE_RESTARTABLE)

که جای From آدرس فایل مبدا و جای To آدرس فایل مقصد رو مینویسیم.

mostafaVB
پنج شنبه 13 شهریور 1393, 23:48 عصر
ظاهراً کسی نمی خواد جواب ما رو بده!
.
.
.
خلاصه ممنون از دوستان که وقت گذاشتند و به این تاپیک جواب دادند مخصوصاً از جناب vbhamed (http://barnamenevis.org/member.php?10624-vbhamed) عزیز که راهنمایی های خوبی کردند.

vbhamed
دوشنبه 17 شهریور 1393, 21:31 عصر
سلام

خب شما الان يك تابع كپي داريد كه Progressbar هم داره، بايد اين برنامه رو تعميم بديد
با كمك دستور Dir يا با كمك Fso ابتدا يك ليست كامل از فايلهاي درون پوشه مورد نظر به همراه آدرس هر فايل رو بدست بياريد و بعد يكي يكي اونها رو كپي كنيد، البته در مقصد هم بايد پوشه ها ساخته بشه