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

Откуда:
Сообщений: 408
Подскажите, как организовать прогресс-бар для команды "copy file". Я пытался сделать следующее: создается форма

код инициализации :
ADIR(arrr,'D:\Install\oracle\oracle_1_3.7z')
thisform.olecontrol1.min=1
thisform.olecontrol1.max=arrr[1,2]

на нее вешаются:

прогресс бар,

таймер
enabled=.f.
interval=50

user procedure:

ADIR(arrr,'D:\oracle_1_3.7z')
thisform.olecontrol1.value=arrr[1,2]

кнопка
user procedure:

thisform.timer1.enabled=.t.
COPY FILE D:\Install\oracle\oracle_1_3.7z TO d:\

В итоге файл копируется в течении нескольких десятков секунд, а прогресс бар остаеться пустым. И заполняется по максимуму только по завершению копирования.
11 мар 10, 11:16    [8460205]     Ответить | Цитировать Сообщить модератору
 Re: progres bar при копировании файлов  [new]
AmKad
Member

Откуда:
Сообщений: 5222
faustgreen,

Copy File не даст вам отследить состояние копирования - это отдельная команда.
Непонятно - зачем все эти танцы с таймером?
11 мар 10, 11:31    [8460317]     Ответить | Цитировать Сообщить модератору
 Re: progres bar при копировании файлов  [new]
faustgreen
Member

Откуда:
Сообщений: 408
AmKad,
Вопрос вот в чем: Есть приложение, при каждом старте которого осуществляется проверка наличия обновлений на другом компьютере в сети(проверяются даты у пользователя и в сети, и если они отличаются, производится копирование новых файлов с удалением старых). Процесс копирования давольно долгий, поэтому нужно создать прогреес бар. Как это лучше сделать ?
11 мар 10, 11:45    [8460470]     Ответить | Цитировать Сообщить модератору
 Re: progres bar при копировании файлов  [new]
AmKad
Member

Откуда:
Сообщений: 5222
faustgreen,

Прогресс-бар на копирование одного файла командой copy file не повесишь. Если файлов несколько то можно увеличивать value прогрессбара на 1 после каждого скопированного файла.

Может быть не стоит заморачиваться и достаточно просто вывести сообщение мол ждите, идет копирование, по окончании копирования выдавать мессагу.
11 мар 10, 11:55    [8460590]     Ответить | Цитировать Сообщить модератору
 Re: progres bar при копировании файлов  [new]
faustgreen
Member

Откуда:
Сообщений: 408
Пробовал копировать файл через TotalComander, а в это время в ComandWindows FoxPro вбивал код
ADIR(arrr,'D:\oracle_1_3.7z')
MESSAGEBOX(arrr[2])
все работает - отображается текущий размер файла. Может как нибудь это можно использовать(отследить где-нибудь это дело в винде или скопировать файлы ее функциями) ?
11 мар 10, 12:03    [8460664]     Ответить | Цитировать Сообщить модератору
 Re: progres bar при копировании файлов  [new]
faustgreen
Member

Откуда:
Сообщений: 408
AmKad,
Все так и был организованно, но попросили переделать. Мол, чтобы было видно, что приложение не повисло. =(
11 мар 10, 12:08    [8460718]     Ответить | Цитировать Сообщить модератору
 Re: progres bar при копировании файлов  [new]
reware
Member

Откуда: Хабаровск
Сообщений: 585
faustgreen
AmKad,
Все так и был организованно, но попросили переделать. Мол, чтобы было видно, что приложение не повисло. =(

Надуманная проблема. Соберите ADIR'ом список копируемых файлов и выполняйте для каждого из них отдельный COPY FILE в цикле, наращивая при этом текущее значение прогрессбара.
11 мар 10, 12:15    [8460788]     Ответить | Цитировать Сообщить модератору
 Re: progres bar при копировании файлов  [new]
faustgreen
Member

Откуда:
Сообщений: 408
reware,
Не совсем понял Ваше предложение. Прогресбар нужен не для индикации копирования файлов, а для отображения хода копирования оделного файла.(т.е.Скопировано 50% такого то файла). Ну или, если их несколько, прогресс бар строиться по сумме размеров всех файлов.(т.е. скопированно столькото процентов от общего объема)
11 мар 10, 12:30    [8460935]     Ответить | Цитировать Сообщить модератору
 Re: progres bar при копировании файлов  [new]
tanglir
Member

Откуда:
Сообщений: 28966
faustgreen,

ну тады пользуйтесь fopen(),fread(),fwrite() и т.д.
11 мар 10, 13:46    [8461726]     Ответить | Цитировать Сообщить модератору
 Re: progres bar при копировании файлов  [new]
Kruchinin Pahan
Member

Откуда: Екатеринбург
Сообщений: 925
faustgreen
reware,
Не совсем понял Ваше предложение. Прогресбар нужен не для индикации копирования файлов, а для отображения хода копирования оделного файла.(т.е.Скопировано 50% такого то файла). Ну или, если их несколько, прогресс бар строиться по сумме размеров всех файлов.(т.е. скопированно столькото процентов от общего объема)

Никак. Фокс приложение однопоточное. Когда мы даем команду на копирование файла, поток занимается собственно копированием.

Есть простое решение - в другом потоке (ActiveX) запустить авишку с изображением перемещающегося файла, как это сделано в самой ОС windows.
11 мар 10, 13:51    [8461770]     Ответить | Цитировать Сообщить модератору
 Re: progres bar при копировании файлов  [new]
faustgreen
Member

Откуда:
Сообщений: 408
tanglir, спасибо.
Вроде бы нашел похожее решения. Буду разбираться.
если кому вдруг понадобится:

****************************************************************************
* COPYFILE.PRG - Used to copy a file while displaying progress bar.
* v1.00          This .PRG is an offshoot of SENDFORM.PRG
*                                 Written by Cory A. Jaeger
*       SYNTAX -  =SENDFORM("srcfile","destfile") 
*                Where srcfile is the file to copy from and destfile
*                is the file to copy to.
*
* FREE!!! - I wrote this program because of a message on Compu$erve
*           and because it seemed easy enough to change SENDFORM.PRG
*           to do this kind of file copy.  I would like to place
*           it into puplic domain on the following conditions.
*         - If you use it, PLEASE let me know.  (It s nice to know that
*           others find your work useful.)  CIS - 73424,536.
*         - A thank-you gift of $1 would be appreciated if you find that
*           you are frequently using this code either un-modified or
*           as a base for other code.  (HOWEVER, IT IS NOT REQUIRED!)
*         - I must get credit for this code if used in any publication.
*         - My name must not be removed from the comments of this code
*           as the original writer.
*         - If you release any updated/revised version, you must add
*           to these comments.  Include your name and a summary
*           of what you have fixed/added.  (Please, send me a copy of
*           the updated code.)
*
*
*   PARAMETERS - m.srcf, m.dest - (Character) Filenames.
*
****************************************************************************
&& BGA 17.11.2006 [*] - переведено на русский
PARAMETERS m.srcf, m.dest
PRIVATE m.fhand, m.fsize, m.fsent, m.pct, m.opct, m.buffer, m.bcount
PRIVATE m.dhand, m.answr, cur_talk, m.fwasread, m.scount, m.fname
* Save original SET TALK settings
IF SET("TALK") = "ON"
   SET TALK OFF
   cur_talk="ON"
ELSE
   cur_talk="OFF"
ENDIF

IF EMPTY(m.srcf)                                 && If no filename passed.
   m.srcf="Не указан файл-источник"              && Will generate an error later.
ELSE
	m.fname=UPPER(SUBSTR(m.srcf,RAT('\',m.srcf)+1))
ENDIF
IF EMPTY(m.dest)                                 && If no filename passed.
   m.srcf="Не указан файл-приёмник"              && Will generate an error later.
ENDIF
m.fhand=-1
m.dhand=-1

m.goodcopy=.F.
m.answr="1"
DO WHILE UPPER(m.answr)<>"2"                     && Keep trying until user says stop.
   m.fhand=FOPEN(m.srcf)                         && Open file.
   IF m.fhand=-1                                 && IF open failed.
      ??CHR(7)                                   && Beep
      WAIT WINDOW "Нет доступа/не найден файл: "+m.srcf+CHR(13)+;
         "Повторить попытку? Да - (1), Нет - (2)" TO m.answr
   ELSE
      m.answr="2"                                && Stop trying if file opens ok.
   ENDIF
ENDDO
IF m.fhand=-1                                    && If file opens were successful..
	DO RESET_ENV
	RETURN .F.
ENDIF
* It would be a good idea to check for existance of the file and warn
*  user of potential overwrite.... before going on.
m.answr="1"
DO WHILE UPPER(m.answr)<>"2"                     && Keep trying until user says stop.
   m.dhand=FCREATE(m.dest)                       && Open file.
   IF m.dhand=-1                                 && IF open failed.
      ??CHR(7)                                   && Beep
      WAIT WINDOW "Не могу создать файл: "+m.dest+CHR(13)+;
         "Повторить попытку? Да - (1), Нет - (2)" TO m.answr
   ELSE
      m.answr="2"                                && Stop trying if file created ok.
   ENDIF
ENDDO
IF m.dhand=-1
	DO RESET_ENV
	RETURN .F.
ENDIF
m.fsize=FSEEK(m.fhand,0,2)                       && Get file size (For progress)
=FSEEK(m.fhand,0)                                && Set pointer to beginning.
m.opct=101
m.fsent=0                                        && Bytes sent to dest. file.
m.fwasread=0                                     && Bytes read from file.
=progress(0,"Копирование...")                   && display thermometer
DO WHILE !FEOF(m.fhand)                          && Continue till end of file is reached.
   m.buffer=FREAD(m.fhand,4096)                  && Read approx 2k of data
   m.bcount=LEN(m.buffer)                        && How much was actually read?
   m.scount=FWRITE(m.dhand,m.buffer, 4096)       && Write to new file...
   IF m.scount<>m.bcount                         && Less copied than read?
   	WAIT WINDOW "Ошибка при копировании файла..."
   	DO RESET_ENV
   	RETURN .F.
   ENDIF
   m.fsent=m.fsent+m.scount                      && Update bytes copied.
   m.fwasread=m.fwasread+m.bcount                && Update bytes read.
   m.pct=INT(m.fsent/m.fsize*100)                && Calculate % completed.
   IF m.pct<>m.opct                              && If different % than last call to PROGRESS.PRG
      m.opct=m.pct
      =progress(m.pct, ;
               "Копирование:"+m.fname)          && Update thermom.
   ENDIF
ENDDO
IF m.fwasread<>m.fsize
	WAIT WINDOW "Ошибка чтения при копировании..."
	DO RESET_ENV
	RETURN .F.
ENDIF
=progress(100,"Завершен - "+m.fname)                      && Be sure themom. shows 100% and "Done"
=INKEY(1)                                  && Let user have time to see 100%
DO RESET_ENV
RETURN .T.

PROCEDURE RESET_ENV
=progress(-1)                              && Remove progress bar if it exists.
IF m.fhand<>-1
	=FCLOSE(m.fhand)                        && Close the Source file 
ENDIF
IF m.dhand<>-1
	=FCLOSE(m.dhand)                        && Close the Destination file 
ENDIF
SET TALK &cur_talk                         && Restore old SET TALK setting
RETURN
+
****************************************************************************
* PROGRESS.PRG - Progress Thermometer   v1.10
*                Displays a progress thermometer and percent complete
*                Written by Cory A. Jaeger
*       SYNTAX -  =PROGRESS(percent,message)
*
*
* FREE!!! - I wrote this program for my own use and am releasing
*           it into puplic domain on the following conditions.
*         - If you use it, PLEASE let me know.  (Its nice to know that
*           others find your work useful.)  CIS - 73424,536.
*         - A thank-you gift of $1 would be appreciated if you find that
*           you are frequently using this code either un-modified or
*           as a base for other code.  (HOWEVER, IT IS NOT REQUIRED!)
*         - I must get credit for this code if used in any publication.
*         - My name must not be removed from the comments of this code
*           as the original writer.
*         - If you release any updated/revised version, you must add
*           to these comments.  Include your name and a summary
*           of what you have fixed/added.  (Please, send me a copy of
*           the updated code.)
*
*
*  Parameters:     m.prcnt - Percent complete (0-100) [optional]
*                          - Defaults to 0, values over 100 are set to 100.
*                          - Sending negative number releases window.
*                m.message - Message to place in progress window.  [character,optional]
*                          - 58 Characters MAX  (Extra is truncated.)
*                          - Defaults to "Working"
*
***************************************************************************
&& BGA 17.11.2006 [*] - переведено на русский
PARAMETERS m.prcnt, m.message
PRIVATE old_talk, cur_win
IF SET("TALK")="ON"
   SET TALK OFF
   old_talk="ON"
ELSE
   old_talk="OFF"
ENDIF
IF EMPTY(m.message)                              && Default message
   m.message="Копирую"
ENDIF
m.message=LEFT(ALLTRIM(m.message),58)            && Truncate extra characters.
IF EMPTY(m.prcnt)                                && Default Percent complete to 0
   m.prcnt=0
ENDIF
IF m.prcnt<0                                     && Release & clear progress window when done.
   IF WEXIST("_THERMOM")
      RELEASE WINDOW _thermom
   ENDIF
   RETURN
ENDIF
cur_win=WOUTPUT()                                && Get current output window
IF !WEXIST("_THERMOM")                           && Define window if doesnt exist
   DEFINE WINDOW _thermom FROM 10,10 TO 15,69;
      FOOTER " Прогресс ";
      COLOR SCHEME 5
ENDIF
ACTIVATE WINDOW _thermom                         && Show our Thermometer bar on top.
IF m.prcnt>100                                   && Prevent >100% thermometer.
   m.prcnt=100
ENDIF
m.prcnt=ROUND(m.prcnt,0)                         && Round off any decimal places
@0,0 SAY PADC(m.message,58)
@2,1 SAY TRANSFORM(m.prcnt,"999")+"% "+;
   REPLICATE("█",INT(m.prcnt/2))+REPLICATE("#",50-INT(m.prcnt/2))
SET TALK &old_talk                               && Restore old SET TALK setting
IF EMPTY(cur_win)                                && Set output back to original window
   ACTIVATE SCREEN
ELSE
   ACTIVATE WINDOW (cur_win) SAME
ENDIF
11 мар 10, 14:25    [8462125]     Ответить | Цитировать Сообщить модератору
 Re: progres bar при копировании файлов  [new]
1270.0.1
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 64
как вариант (идея от Piva http://foxclub.ru)
m.cCmd=[xcopy "что_копируем" "куда_копируем"] && команда копирования
m.cSI=Replicate(Chr(0),68)
m.cPI=Replicate(Chr(0),16)
Declare Integer WaitForSingleObject In win32api Integer hProcessHandle, Integer dwTimeOut
Declare Integer CreateProcess In win32api String lpApplicationName,String lpCommandLine,;
	String lpProcessAttributes,String lpThreadAttributes,Integer bInheritHandles,;
	Integer dwCreationFlags,String lpEnvironment,String lpCurrentDirectory,;
	String lpStartupInfo,String @lpProcessInformation

If CreateProcess(null,m.cCmd,null,null,1,0x08000000,null,null,@m.cSI,@m.cPI)=1
	m.nProcID=Asc(SubStr(m.cPI,4,1))*256+Asc(SubStr(m.cPI,3,1))*256+Asc(SubStr(m.cPI,2,1))*256+Asc(Left(m.cPI,1))
	Do While WaitForSingleObject(m.nProcID,50)#0
		DoEvents
		* сбор сведений о ходе копирования
		* для формирования ProgressBar
	EndDo
EndIf
Clear Dlls CreateProcess, WaitForSingleObject
11 мар 10, 14:53    [8462394]     Ответить | Цитировать Сообщить модератору
 Re: progres bar при копировании файлов  [new]
reware
Member

Откуда: Хабаровск
Сообщений: 585
1270.0.1
как вариант (идея от Piva http://foxclub.ru)

Вот это больше похоже на правду, нежели жутковатое многотонное копирование от автора.
11 мар 10, 15:18    [8462630]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить