PDA

View Full Version : سوال: نمایش میزان کپی شدن فایل با Progress Bar



ali190
جمعه 11 آذر 1390, 11:02 صبح
باسلام و عرض خسته نباشد
در نمونه پروژه پیوستی میزان کپی شدن فایل با پروسزبار نمایش داده میشود
اما مشکل اینجاست که این سورس برای فایلهای با حجم بالا درست کار نمیکند (مثلاً فایلی با حجم 3 گیگ)
ممنون میشم کمکم کنید تابتونم این نمونه رو برای کپی شدن فایلها با حجم بالاتر هم اصلاح کنم
ممنون
یاعلی

just4froum
جمعه 11 آذر 1390, 11:11 صبح
از نظر من اصلا این برنامه اشکال داره چون میاد بیشترین مقدار progressbar رو میگیره حجم فایل به بایت و هر یک بایتی که کپی میکنه یک واحد به progressbar اضافه میکنه که همین باعث میشه که زمان کپی چند ده برابر بشه.

ali190
جمعه 11 آذر 1390, 11:51 صبح
سلام
ولی میزان میزان پروسزبار Prb.Value = Prb.Value + Buffer هست
اندازه بافر در حالت پیش فرض 1024 بایت یا 1 کیلوبایت هست
من برنامه رو تست کردم تا حجم 1 گیگ رو بصورت معقول و منطبق با زمان کپی شدن توسط ویندوز عمل میکنه
من فقط میخوام این برنامه برای حجم های بالاتر هم درسست عمل کنه

just4froum
جمعه 11 آذر 1390, 11:56 صبح
سلام
ولی میزان میزان پروسزبار Prb.Value = Prb.Value + Buffer هست
اندازه بافر در حالت پیش فرض 1024 بایت یا 1 کیلوبایت هست
من برنامه رو تست کردم تا حجم 1 گیگ رو بصورت معقول و منطبق با زمان کپی شدن توسط ویندوز عمل میکنه
من فقط میخوام این برنامه برای حجم های بالاتر هم درسست عمل کنه

حق با شماست اصلا دقت نکرده بودم.

ali190
جمعه 11 آذر 1390, 12:50 عصر
دوستان ممنون میشم در جهت رفع مشکل از سورس موجود کمکم کنید
یاعلی

M.T.P
جمعه 11 آذر 1390, 14:05 عصر
سلام
مقدار برگشتی تابع FileLen از نوع Long هست و این یعنی اینکه سایز فایل هایی با حجم 2GB بیشتر رو نمیشه با این تابع بدست آورد.

برای بدست آوردن فایل هایی با حجم بالای 2GB باید از FSO استفاده کنید.

رفرنس Microsoft Script runtime

استفاده:



Dim fso As New FileSystemObject
Dim fSize As Double

fSize = fso.GetFile(StrFileName).Size

ali190
جمعه 11 آذر 1390, 14:29 عصر
سلام
ممنون جناب M.T.P
طبق راهنماییتون فیابل رو اصلاح کردم
ولی باز هم در 2 گیگ به بالا ارور گرفتم
ملاحظه بفرمائید.
ممنونم
یاعلی

M.T.P
جمعه 11 آذر 1390, 15:36 عصر
تا جایی که بنده اطلاع دارم دستور Open یک روش کلاسیک برای دسترسی به فایل هست و تا 2GB بیشتر رو ساپورت نمی کنه.

شما می تونید از پنجره کپی فایل ویندوز هم استفاده کنید و کلا Progress و تایم و قابلیت Cancel هم داره.

کد ماژول:



Option Explicit

Private Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAnyOperationsAborted As Long
hNameMappings As Long
lpszProgressTitle As String
End Type

Private Declare Function SHFileOperation Lib "shell32.dll" _
Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

Private Const FOF_ALLOWUNDO = &H40
Private Const FOF_NOCONFIRMATION = &H10
Private Const FO_COPY = &H2

Public Function ShellFileCopy(src As String, dest As String, Optional NoConfirm As Boolean = False) As Boolean

Dim WinType_SFO As SHFILEOPSTRUCT
Dim lRet As Long
Dim lflags As Long

lflags = FOF_ALLOWUNDO
If NoConfirm Then lflags = lflags & FOF_NOCONFIRMATION
With WinType_SFO
.wFunc = FO_COPY
.pFrom = src
.pTo = dest
.fFlags = lflags
End With

lRet = SHFileOperation(WinType_SFO)
ShellFileCopy = (lRet = 0)

End Function

استفاده:


Dim bSuccess As Boolean
bSuccess = ShellFileCopy("D:\1.iso", "C:\2.iso")
If bSuccess = False Then
MsgBox "Copy operation success", vbInformation
Else
MsgBox "Copy operation failed", vbExclamation
End If

ali190
جمعه 11 آذر 1390, 17:02 عصر
سلام
ممنون از راهنماییتون
ولی من میخوام این کار از طریق برنامه و کاملاً نستقل از ویندوز انجام بگیره
پس vb6 در این زمینه محدودیت تا حجم 2 گیگ رو داره؟!
ممنون
یاعلی

vbhamed
شنبه 12 آذر 1390, 10:07 صبح
سلام

اينم يك نمونه براي فايلهاي با حجم زياد به كمك API ويندوز
هر چقدر بافر بيشتر باشه سرعت بالاتره البته در بافرهاي كم، 50 كيلوبايت مناسبه

ali190
جمعه 25 آذر 1390, 10:51 صبح
سلام
ممنون جناب vbhamed از سورسی که در اختیار گذاشتید
ولی این سورس دو تا اشکال داره:
1-هنگام شروع عملیات فایل در مبداء در همان ابتدا ایجاد نمیشود ، در واقع فایلی که قصد کپی شدن اون وجود داره در مقصد رزرو نمیشود.
2-مشکل دوم اینه که فایل در حافظه شکل میگیرد و بعد از اتمام عملیات کپی شدن از حافظه به مقصد منتقل میگردد که این عملیات انتقال از حافظه به مقصد در پروسه پوسزبار گنجانده نشده است که این امر در کپی شدن یک فایل در حجم بالا کاملاً مشهود است.
ممنون میشم مشارکت بفرمائید
یاعلی

vbhamed
جمعه 25 آذر 1390, 11:47 صبح
سلام
ممنون جناب vbhamed از سورسی که در اختیار گذاشتید
ولی این سورس دو تا اشکال داره:
1-هنگام شروع عملیات فایل در مبداء در همان ابتدا ایجاد نمیشود ، در واقع فایلی که قصد کپی شدن اون وجود داره در مقصد رزرو نمیشود.
سلام
اين كار ابتدا در پوشه ريشه درايو مقصد انجام مي‌شود



2-مشکل دوم اینه که فایل در حافظه شکل میگیرد و بعد از اتمام عملیات کپی شدن از حافظه به مقصد منتقل میگردد که این عملیات انتقال از حافظه به مقصد در پروسه پوسزبار گنجانده نشده است که این امر در کپی شدن یک فایل در حجم بالا کاملاً مشهود است.
ممنون میشم مشارکت بفرمائید
یاعلی
اگر قرار باشه يك فايل مثلا 4 گيگابايتي در حافظه قرار بگيره كه ديگه نميشه با سيستم كار كرد، اين برنامه ابتدا يك فايل Temp در پوشه ريشه درايو مقصد مي‌سازه و عمل كپي رو در اون انجام مي‌ده و پس از اتمام عمل كپي نام و پوشه اون فايل رو به نام و مسير مقصد تغيير مي‌ده
البته براي راحتي شما برنامه رو تغيير دادم تا مسير فايل Temp هم همون مسير مقصد باشه نه ريشه درايو
از همون پست قبلي مجددا دانلود نماييد