Estoy tratando de crear un utilitario para respaldar archivos xml de un disco duro a otro en un servidor, el problema es que son muchos miles de ellos en el orden de 500000 archivos, lo estoy haciendo con
cFilein = 'z:\sistemas\xml\123456789.xml'
cFileOut = 'r:\respaldos\sistemas\xml\123456789.xml'
copy file ( cFilein ) to ( cFIleOut )
el programa se queda congelado ya he tratado de porner sysrefresh, estoy utilizando una window para esto ademas no me funcionan los meter que he puesto, la lectura la hago son directory() y me demora un minuto en la lectura pero al procesarlos se congela
aca algo del codigo donde se queda congelada la ventana
- Code: Select all Expand view RUN
- method respaldo() class tWg_AlmacenXml
local i
local j
local k
local nLen
local cFile
local cFileOut
for i = 1 to len( ::aCaminosfe ) //para cada almacen
sysrefresh()
::oInterfaz:oWnd:SetMsg( ::aCaminosFe[ i ] )
::oInterfaz:oMeter:nTotal = len( ::aDirsfe )
::oInterfaz:oMeter:set( 0 )
::oInterfaz:oMeter:refresh()
::cPathFe = ::aCaminosFe[ i ] //apunte al almacen
if ::lStop
exit
end
for j = 1 to len( ::aDirsfe ) //dentro del almacen cada directorio de data
::oInterfaz:oMeter:set( j )
::oInterfaz:oMeter:refresh()
::cSectionFe = ::aDirsfe[ j ] //'compgen\autorizados' //apunte a directorio de data dentro del almacen
::cMascara = ::aMascaras[ j ] // *.xml la terminacion de los archivos dentro de ese directorio
::oInterfaz:oWnd:SetMsg( 'leyendo .. ' + ::cPathfe + ::cSectionFe )
//msginfo('voy a leer')
::leeData() //leo los datos
nLen = len( ::aData )
::oInterfaz:oWnd:SetMsg( 'proc .. ' + alltrim( str( nLen ) ) + ' archs ' + ::cPathRespaldo + ::cSectionFe )
sysrefresh()
//msginfo('ya lei')
makedir( ::cPathRespaldo + ::cSectionFe ) //crea si no existe el directorio destino
::oInterfaz:oMeter1:nTotal = nLen
::oInterfaz:oMeter1:set( 0 )
::oInterfaz:oMeter1:refresh()
::oInterfaz:oWnd:refresh()
for k = 1 to nLen
if k % 10 == 0
sysrefresh()
//msginfo('acabo de refrescar')
::oInterfaz:oWnd:SetMsg( ::cPathRespaldo + ::cSectionFe + str( k, 8 ) + ' / ' + str( nLen, 8 ) )
end
if ::lStop
exit
end
::oInterfaz:oMeter1:set( k )
::oInterfaz:oMeter1:refresh()
cFile = ::cPathFe + ::cSectionFe + ::aData[ k, 1 ]
cFileOut = ::cPathRespaldo + ::cSectionFe + ::aData[ k, 1 ]
//msginfo( cFile + CRLF + cFileOut )
if !file( cFileOut )
copy file ( cFile ) to ( cFileOut )
end
next
::aData = {}
next
next
return nil
el codigo de la ventana es
- Code: Select all Expand view RUN
- method ventana() class tWg_InterfazAlmacenXml
local oSelf := Self
DEFINE WINDOW ::oWnd FROM 0, 0 TO 450, 600 ;
TITLE "Manejador de almacenes xml de facturación electrónica" PIXEL
@ 050, 10 METER ::oMeter VAR ::nActual TOTAL ::nTotal OF ::oWnd SIZE 235, 50 PIXEL
@ 150, 10 METER ::oMeter1 VAR ::nActual1 TOTAL ::nTotal1 OF ::oWnd SIZE 235, 50 PIXEL
@ 250, 10 BUTTON "&Parar Respaldo" OF ::oWnd SIZE 100, 50 ;
ACTION ( oSelf:oAlmacen:lStop := .t. ) PIXEL
//@ 350, 10 SAY ::oSay PROMPT "leyenda aca ...." OF ::oWnd SIZE 300, 50
SET MESSAGE OF oSelf:oWnd TO 'mensajes del sistema de repaldos' NOINSET CLOCK DATE KEYBOARD
::oWnd:Say( 350, 10, 'leyendas van aca......', , , , .t. )
ACTIVATE WINDOW ::oWnd on INIT ( oSelf:oAlmacen:oInterfaz := oSelf ,;
oSelf:oAlmacen:leeconfig() ,;
oSelf:oAlmacen:respaldo() ,;
oSelf:oWnd:end() )
return nil
alguien ha hecho algo parecido ?
me podrian dar unos consejos al respecto, muchas gracias de antemano
he probado con comando xcopy y se sale sin dar errores y no termina la copia, la idea es hacerlo de una manera automatizada
ademas de la forma que lo estoy haciendo tengo el inconveniente que las fechas son cambiadas de los ficheros si alguien sabe como copiarlos respetando la fecha de creacion
att
Wilson Gamboa A
Quito Ecuador