Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 ПрогрессБар при копировании файлов  [new]
startFOX
Member

Откуда:
Сообщений: 153
Требуется определённое количество файлов скопировать в другое место (скажем, сделать резервную копию). Размер каждого файла разный.

Подскажите, пожалуйста, что можно сделать, чтобы прогрессБар адекватно отражал процесс копирования?

Решение
ПрогрессБар.MAX = количество_файлов
не интересует
20 июл 06, 10:57    [2903462]     Ответить | Цитировать Сообщить модератору
 Re: ПрогрессБар при копировании файлов  [new]
startFOX
Member

Откуда:
Сообщений: 153
Скажите, это настолько просто, что никому даже не хочется отвечать?

Или всё-таки это невозможно разрешить?

А может неясно поставил вопрос?

P.S. VFP7
20 июл 06, 14:19    [2904984]     Ответить | Цитировать Сообщить модератору
 Re: ПрогрессБар при копировании файлов  [new]
Dima T
Member

Откуда:
Сообщений: 15301
Если речь идет о большом количестве файлов:
ПрогрессБар.MAX = общий_размер_файлов
ADIR() возвращает в т.ч. и размер файла. Предварительно посчитай общий размер и показывай размер скопированных.

Если же один большой файл, то все на порядок сложнее. Есть WinAPI функция CopyFileEx() для таких целей, но из фокса ее использовать довольно проблематично.
20 июл 06, 14:30    [2905053]     Ответить | Цитировать Сообщить модератору
 Re: ПрогрессБар при копировании файлов  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Если размер файла есть критерий длительности процесса, то все просто:
1. Расчитывайте полный размер всех переносимых файлов:
ADIR(laDim, m.lcFileName)
2. При копировании каждого файла вычисляете % выполнения, как отношение нарастающего размера скопированных файлов к общему размеру всех файлов (см. п.1)

С уважением, Алексей
20 июл 06, 14:30    [2905058]     Ответить | Цитировать Сообщить модератору
 Re: ПрогрессБар при копировании файлов  [new]
FoxFox
Guest
Zdes v Forume ktoto pridlijil vot takoy primer :

LOCAL lcFrom as String, lcTo as String, lcMask as String
lcMask=INPUTBOX('Введите маску для файлов','Маска файлов','*.*')
IF EMPTY(lcMask)
RETURN
ENDIF
lcFrom=GETDIR('C:\','Исходное местоположение','Выбор папки',1)
IF EMPTY(lcFrom)
RETURN
ENDIF
lcTo=GETDIR(lcFrom,'Новое местоположение','Выбор папки',65)
IF EMPTY(lcFrom)
RETURN
ENDIF
IF lcFrom==lcTo
=MESSAGEBOX('Новое местоположение совпадает с исходным.',48)
RETURN
ENDIF
IF !CopyFiles(lcFrom, lcTo, lcMask)
=MESSAGEBOX('Копирование файлов было отменено или произошла ошибка.',48)
ENDIF
***********************************************
FUNCTION CopyFiles
LPARAMETERS tcFrom as String,;
tcTo as String,;
tcMask as String

#define FO_COPY 0x0002
#define FOF_NOCONFIRMATION 0x0010 && Don't prompt the user.
#define FOF_FILESONLY 0x0080 && on *.*, do only files
#define FOF_NOERRORUI 0x0400 && don't put up error UI
#define FOF_NOCOPYSECURITYATTRIBS 0x0800 && dont copy NT file Security Attributes

LOCAL lcSHFO as String
LOCAL lnHeap as Integer
LOCAL lcpFrom as String, lcpTo as String
LOCAL lnpFrom as Integer, lnpTo as Integer
LOCAL lnFlags as Integer
LOCAL i as Integer
LOCAL llReturn

DECLARE INTEGER SHFileOperation IN shell32.dll string @
DECLARE INTEGER GetProcessHeap IN WIN32API
DECLARE INTEGER HeapAlloc IN WIN32API;
INTEGER hHeap, INTEGER dwFlags, INTEGER dwBytes
DECLARE INTEGER HeapFree IN WIN32API;
INTEGER hHeap, INTEGER dwFlags, INTEGER lpMem
DECLARE RtlMoveMemory IN WIN32API;
INTEGER nDestBuffer, STRING @pVoidSource, INTEGER nLength

lnHeap=GetProcessHeap()
lcSHFO=int2bin(_screen.hwnd)
lcSHFO=lcSHFO+int2bin(FO_COPY)
lcpFrom=ADDBS(tcFrom)+tcMask+CHR(0)+CHR(0)
lcpTo=+ALLTRIM(tcTo)+CHR(0)+CHR(0)
lnpFrom=HeapAlloc(lnHeap,0,LEN(lcpFrom))
lnpTo=HeapAlloc(lnHeap,0,LEN(lcpTo))
=RtlMoveMemory(lnpFrom,@lcpFrom,len(lcpFrom))
=RtlMoveMemory(lnpTo,@lcpTo,len(lcpTo))
lcSHFO=lcSHFO+int2bin(lnpFrom)+int2bin(lnpTo)
lnFlags=FOF_NOCONFIRMATION+FOF_FILESONLY+FOF_NOCOPYSECURITYATTRIBS
lcSHFO=lcSHFO+int2bin(lnFlags)+REPLICATE(CHR(0),12)
llReturn=IIF(SHFileOperation(@lcSHFO)=0,.T.,.F.)
= HeapFree(lnHeap,0,lnpFrom)
= HeapFree(lnHeap,0,lnpTo)
CLEAR DLLS
RETURN llReturn
ENDFUNC
***********************************************
FUNCTION int2bin
LPARAMETERS tnValue as Integer
LOCAL lcReturn as String, lnValue as String, i as Integer
lcReturn=''
FOR i=3 TO 0 step -1
lnValue=INT(tnValue/256^i)
lcReturn=chr(lnValue)+lcReturn
tnValue=tnValue-lnValue*256^i
ENDFOR
RETURN lcReturn
ENDFUNC
20 июл 06, 16:12    [2905754]     Ответить | Цитировать Сообщить модератору
 Re: ПрогрессБар при копировании файлов  [new]
Вот
Guest
вот здесь описано как стандартный виндовский прогресс вызвать, в конце статьи
20 июл 06, 16:21    [2905824]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить