Форум » GUI » Копирование больших объемов » Ответить

Копирование больших объемов

al-sklif: Здравствуйте! Задача вроде бы тривиальная: скопировать по сети некое количество файлов, но большого размера. Это благополучно реализуется соответствующей командой или функцией. Однако ввиду достаточной длительности хотелось бы наблюдать за процессом. Реализованный пример из SAMPLES\BASIC\Filecopy работает, но как показала жестокая действительность, хорош для небольших файлов. На файле порядка 300М он движется процентов до 20, потом тормозит и в конце отваливается. Может есть другие варианты? Спасибо!

Ответов - 3

PSP: Попоробуйте в цикл, в котором происходит копирование, добавить команду DO EVENTS.

gfilatov2002: al-sklif пишет: Реализованный пример из SAMPLES\BASIC\Filecopy работает, но как показала жестокая действительность, хорош для небольших файлов. Только что с помощью этого примера перегнал по сетке тестовый файл размером 225 МБ. Ниже полный текст этого примера (изменил в 2-х местах): /* * FileCopy with Progressbar HMG - Demo * Copyright 2004 Jacek Kubica <kubica@wssk.wroc.pl> * http://www.wssk.wroc.pl/~kubica */ #include "MiniGUI.ch" #define _TITLE 'FileCopy demo by Jacek Kubica <kubica@wssk.wroc.pl>' #define _SHOW_PERCENT 5 #define _SMALL_BLOCK 4096 #define _DEFAULT_BLOCK 8192 #define _LARGE_BLOCK 16384 Function main() Local WybFol DEFINE WINDOW Form_1 AT 382,270 WIDTH 483 HEIGHT 230 MAIN TITLE "HMG FileCopy Demo" ; NOSIZE NOMAXIMIZE @ 6,1 FRAME Frame_1 CAPTION "" WIDTH 474 HEIGHT 128 @ 29,20 LABEL Label_1 VALUE "Source file:" HEIGHT 19 FONT "Arial" SIZE 9 AUTOSIZE @ 28,110 TEXTBOX TextBox_1 WIDTH 298 HEIGHT 19 @ 26,414 BUTTON Button_1 CAPTION "..." WIDTH 39 HEIGHT 23 ; ACTION {|| (Form_1.TextBox_1.Value := Getfile ( { {'All files ','*.*'} } , 'Select file to copy' ))} @ 62,20 LABEL Label_2 VALUE "Destination:" WIDTH 86 HEIGHT 18 @ 61,110 TEXTBOX TextBox_2 WIDTH 298 HEIGHT 19 @ 59,414 BUTTON Button_2 CAPTION "..." WIDTH 39 HEIGHT 23 ; ACTION {|| (WybFol := GetFolder(), ; Form_1.TextBox_2.Value := WybFol+IIF(RIGHT(WybFol,1)$"\/","","\")+MyGetFileName(Form_1.TextBox_1.Value))} @ 84,200 LABEL Label_3 VALUE "" WIDTH 271 HEIGHT 16 @ 103,7 PROGRESSBAR ProgressBar_1 RANGE 0,100 WIDTH 460 HEIGHT 21 @ 146,96 BUTTON Button_3 CAPTION "Copy" WIDTH 100 HEIGHT 24 ; ACTION FILECOPY(Form_1.TextBox_1.Value, Form_1.TextBox_2.Value, _LARGE_BLOCK, {|nArg| show_it(nArg)}) @ 146,292 BUTTON Button_4 CAPTION "Exit" WIDTH 100 HEIGHT 24 ACTION ThisWindow.Release DEFINE STATUSBAR FONT "Arial" SIZE 9 STATUSITEM _TITLE END STATUSBAR END WINDOW Form_1.Center Form_1.Activate Return Nil ******************************************************************** Function FILECOPY(cSource, cDestination, nBuffer, bBlock) ******************************************************************** Local sourceHandle, destHandle, lSuccess:= .F., TmpBuff, LastPos Local BuffPos, ByteCount, cBType:= ValType(bBlock) Default nBuffer := 8192 IF FILE(cDestination) IF !MsgYesNo("Destination file already exist. Overwrite ?","Warning") RETURN lSuccess ENDIF ENDIF Form_1.StatusBar.Item(1):="Copying in progress ..." If ( (sourceHandle:= fopen(cSource, 0)) != -1 ) If ( (destHandle:= fcreate(cDestination, 0)) != -1 ) LastPos:= fseek(sourceHandle, 0, 2) BuffPos:= 0 ByteCount:= 0 fseek(sourceHandle, 0, 0) Do While (BuffPos < LastPos) TmpBuff := Space(nBuffer) BuffPos += (ByteCount:= fread(sourceHandle, @TmpBuff, nBuffer)) fwrite(destHandle, TmpBuff, ByteCount) If cBType == "B" eval(bBlock, BuffPos / LastPos) EndIf EndDo lSuccess:= fclose(destHandle) EndIf fclose(sourceHandle) EndIf IF lSuccess Form_1.StatusBar.Item(1):="Filecopy finished successfully" ELSE Form_1.StatusBar.Item(1):="Filecopy failed !" ENDIF inkey(1) Form_1.ProgressBar_1.Value:=0 Form_1.Label_3.Value:="" Form_1.StatusBar.Item(1):= _TITLE Return lSuccess ************************************ Function SHOW_IT(nDl) ************************************ Local nPos := int(nDl*100) if nPos % _SHOW_PERCENT == 0 Form_1.Label_3.Value := ltrim(str(nPos))+" % complete" Form_1.ProgressBar_1.Value := nPos DO EVENTS endif return NIL ************************************ FUNCTION MyGetFileName(rsFileName) ************************************ LOCAL i := 0,_FileName:="" FOR i = Len(rsFileName) TO 1 STEP -1 IF SUBSTR(rsFileName, i, 1) $ "\/" EXIT END IF NEXT _FileName := SUBSTR(rsFileName, i + 1) RETURN _FileName

al-sklif: С помощью модернизированного примера все заработало Спасибо!




полная версия страницы