Programación General > Visual Basic 6.0 e inferiores
Filesystemobject,textstream Etc
(1/1)
Dieguinho.:
Hola, tengo un problema, espero que alguno me pueda dar una mano.
Tengo una aplicacion que genera un archivo de texto a modo de log de errores y otras informaciones que me son utiles.
Como este archivo tiende a crecer rapido todos los dias la aplicacion realiza una depuracion y deja solo la informacion de los ultimos dias.
Esto lo hago usando los objetos filesystemobject, file y textsream.
Mas o menos hago lo siguiente:
Abro el archivo, lo recorro linea por linea y si la fecha que tiene la linea (en los primeros caracteres pongo la fecha y la hora) esta dentro del periodo que me quiero quedar (en gral me quedo con los ultimos 2 dias) la grabo en un string y si no paso a la siguiente.
De esta manera al terminar de recorrer todo el archivo en el string me queda solo lo que necesitaria, asi que lo grabo al archivo log reemplazando todo lo que tiene y listo.
Ahora el problema que me paso hace poco fue que al depurar el archivo la parte que me servia era muy grande y, por lo que supongo yo, al acumular tanta info en el string hizo que se me colgase la aplicacion (el administrador de tareas del windows me mostraba que estaba usando casi el 100% del cpu). Resumiendo la pc ni se podia usar de lo lento que estaba.
Alquien se le ocurre algo que pueda hacer?
A mi lo unico que se me ocurrio es ir grabando todo en un archivo auxiliar (despues borro el original y le cambio el nombre al aux. por el del original)
Saludos.
cpmario:
Explica como grabas en un string.
Posiblemente el programa se cuelgue cuando concatenas cadenas de texto como el siguiente ejemplo:
strAlmacena = strAlmacena & strTexto
Muestra algo del código que cuelga el equipo. Para saber de que hablas.
:comp:
Dieguinho.:
El codigo seria el siguiente:
--- Código: Text --- Dim FSO As New Scripting.FileSystemObject Dim fich As Scripting.File Dim ts As Scripting.TextStream Dim sArchivo As String Dim sAux As String 'Busca el archivo a depurar Set fich = FSO.GetFile(sRuta) 'Abre el archivo en modo lectura Set ts = fich.OpenAsTextStream(ForReading) 'Lee una por una todas las lineas del archivo de texto Do While Not ts.AtEndOfStream sAux = ts.ReadLine If Trim(sAux) <> "" Then If CDate(Mid(sAux, 1, 10)) >= (CDate(Mid(Now, 1, 10)) - iDiasConservados) Then If Len(sArchivo) = 0 Then sArchivo = sAux Else sArchivo = sArchivo & vbCrLf & sAux End If Else iEntradasDepuradas = iEntradasDepuradas + 1 End If End If Loop
Luego de esto grabo reemplazo mi archivo de log por sArchivo.
cpmario:
No tengo modo de comprobar el código, espero te de una idea. La rapidez que tiene la notarás enseguida.
--- Código: Text --- Dim FSO As New Scripting.FileSystemObject Dim fich As Scripting.File Dim ts As Scripting.TextStream Dim sArchivo As String Dim sAux As String '---------------------------- Dim strArray() As String Dim lngCnt As Long '--------------------------- 'Busca el archivo a depurar Set fich = FSO.GetFile(sRuta) 'Abre el archivo en modo lectura Set ts = fich.OpenAsTextStream(ForReading) 'Lee una por una todas las lineas del archivo de texto Do While Not ts.AtEndOfStream sAux = ts.ReadLine If Trim(sAux) <> "" Then If CDate(Mid(sAux, 1, 10)) >= (CDate(Mid(Now, 1, 10)) - iDiasConservados) Then If Len(sArchivo) = 0 Then sArchivo = sAux Else 'sArchivo = sArchivo & vbCrLf & sAux '---------------------------- strArray(lngCnt) = sAux lngCnt = lngCnt + 1 If lngCnt >= UBound(strArray) Then ReDim Preserve strArray(UBound(strArray) + 1000) As String End If '---------------------------- End If Else iEntradasDepuradas = iEntradasDepuradas + 1 End If End If Loop '--------------------------- ReDim Preserve strArray(lngCnt) As String sArchivo = Join(strArray, vbCrLf) '--------------------------- Me comentas si te sirvió.
:comp:
cpmario:
Navegación
Ir a la versión completa