Programación General > Visual Basic para principiantes

 Escribir al principio de un archivo txt

(1/1)

sysmcn:
Hola amigos:
Tengo una aplicacion en Vb que utiliza un archivo txt como archivo log, el programa escribe la actividad de sus acciones en el archivo,
el problema es que la ultima linea introducida siempre esta al final del archivo y me gustaria que estuviera al principio del archivo, he mirado lo del
salto de linea o retroceso del carro pero no me aclaro , el codigo que utilizo es el siguiente:


Nota :utilizo dos textbox llamados "Txt_nombre_archivo_log" ,"Txt_comentario" y un commandbutton "Cmd_escribir_log"


Private Sub Cmd_escribir_log_Click() 'BOTON PARA GUARDAR LOS COMENTARIOS EN ARCHIVOS LOG INDICADO
 On Error Resume Next

 
 'grabamos en el archivo "Log" los comentarios indicados
 Open "E:WINDOWSsystem32log" + Txt_nombre_archivo_log For Append As #3 'Ruta y nombre de archivo donde se guardara el comentario
 

Print #3, "Fecha:" & Date & " " & "Hora:" & Time & vbNewLine & Txt_comentario & " " & vbNewLine  'Se escrive el comentario
     Txt_nombre_archivo_log = "": Txt_comentario = "" 'Limpia los textbox
   
 Close #3
End Sub

Nebire:
Creo que tienes un ligero problema de concepto...

Escribir al inicio del fichero no es rentable, porque implica que tendrás que desplazar hacia abajao todo el contenido del fichero actual, o bien moverlo a otro fichero (más abajo te describo 2 modos, ensaya cual resultare más rápido al caso, aunque es probable que sucumbas al más cómodo de programar). Esto supone una sobrecarga innecesaria de trabajo... Quizás tengas imaginado que tu escribes al principio y automáticamente no hace falta más...

Si hablamos de unos pocos kb, o si hablamos de algún que otro Mb. pero la frecuencia de escritura es muy larga, tal vez no implique un exceso de trabajo, pero eso debe saberlo quien diseña el programa, es decir tú.

Si a pesar de todo, necesitas escribir al principio, puedes usar una de 2 soluciones:

1 - Como ya se ha dicho moviendo hacia abajo todo el contenido previo, esto requiere calcular direcciones, además de lento, resulta engorroso. Pero recuerda que deberás mover previamente todo para abajo, lamentablemente, el diseño de los ficheros está limitado para 'append' sólo al final, y no al principio. Utiliza open en los modos output o binary (nunca append) y la instrucción para escribir podrá ser, por ejemplo:  put#canal, posición_byte, lo_qué_escribo_cadena/estructura.


2 - Creas un nuevo fichero, añades eso que quieres, detrás 'pegas' el contenido del log actual, al final destruyes aquél y a este le cambias la entensión, por ejemplo de '.tmp' a '.log' . Utiliza open como hasta ahora con el modo Append. Este método es más sencillo de programar.
-----------------

Si dijeras las razones por las que quieres escribir al principio tal vez se pudiera ofrecer una solución más eficaz, esto es conseguir el objetivo buscado en esas 'razones' sin castigar el trabajo de actualización de los ficheros. Dicho de otro modo, no has descrito correctamente tu problema, sino que te has cerrado en banda con 'quiero esto'...

p.d.: Otra cosa que puedes hacer es, no escribir cada vez que surge la necesidad, al fichero, sino guardarlo localmente en una matriz, y al gfinal del la sesión del programa guardarlo todo de una sola vez, entonces sólo rescribes todo el log 1 única vez y no (pongamos que) 200 veces durante la ejecución del programa...

Un pequeño esquema:

--- Código: Visual Basic --- ' a nivel de formulariodim logs() as stringdim nLogs as long ' al carfgar el formulario en evento loadredim logs(0 to 100)nlogs=0 ' añadir un comentario...private sub AñadirLog( byval log as string)    if log <>"" then          if nlogs =ubound(logs) then              redim preserve logs(0 to nlogs +100)  ' añadimos 100 'líneas' libres más          end if          logs(nlogs)= log           nlogs=nlogs +1    end ifend sub ' antes de salir del programa, en el evento queryunload...' avisar hay operaciones pendientes de realizar...if nlogs <> 0 then  ' si se guardaron logs...     dim n as integer, m as integer      n=freefile     open ruta & "nombrelog" & ".tmp" .............     for k= nlogs to 0 step -1 '  recordar escribirlos en orden inverso....lo que tiene la matriz.          ' escribir linea logs(k)     next      m= freefile    open ruta & "nombrelog.log" ......    ' tomar del canal #m    ' escribir en canal #n      close #m    close #n    kill ruta & "nombrelog.log"   ' renombrar nombrelog.tmp a nombrelog.logend if   La ventaja como se ha indicado es que no se abre (cada vez que se genera un log ), el fichero para añadir una línea al inicio y mover el resto del contenido actual. La desventaja es que existe la posibilidad de que ante un error del programa si se 'cierra de repente', se pierde el log generado ....

Por último es más óptimo usar una opción intermedia, mantener sólo una matriz de 100 elementos:

--- Código: Visual Basic --- ' a nivel de formulariodim logs()dim nLogs as byte ' en load form..redim logs(0 to 99)nLogs=0 ' rutina del log,  añadir un comentario...private sub AñadirLog( byval log as string)    if log <>"" then          logs(nlogs)= log           nlogs=nlogs +1           if nlogs = 100 then  '  cuando se llena la matriz...              ' guardar a fichero los 100 registros... rutina similar a la descrita anteriormente en queryunload...              ' recordar escribirlos en orden inverso.... o apuntar hacia 99 e ir reduciendo...               redim logs(0 to99)  ' sin, preseve... eliminamos contenido actual              nLogs=0  ' reiniciamos nueva cuenta...          end if    end ifend sub ' en query unload, se investiga, si nlogs es dstinto de 0 hay logs por escribir...   

cpmario:
Básicamente es que abras el archivo, lo tomes en una variable de texto, agregues el comentario al principio y lo escribas de nuevo.
Te coloco un ejemplo:


--- Código: Text ---Private Sub Cmd_escribir_log_Click() 'BOTON PARA GUARDAR LOS COMENTARIOS EN ARCHIVOS LOG INDICADO    Dim lngLenFile As Long    Dim intFreeFile As Integer    Dim strLogDocument As String    Dim strTempDocument As String        On Error Resume Next    lngLenFile = 0    intFreeFile = FreeFile    Open "E:WINDOWSsystem32log" & Txt_nombre_archivo_log For Binary As intFreeFile    lngLenFile = LOF(intFreeFile)    strLogDocument = Input(lngLenFile, intFreeFile)    Close intFreeFile    'Escribe el comentario al inicio    strTempDocument = "Fecha:" & Date & " " & "Hora:" & Time & vbNewLine & Txt_comentario & " " & vbNewLine & strLogDocument        intFreeFile = FreeFile    Open "E:WINDOWSsystem32log" & Txt_nombre_archivo_log For Output As gintFreeFile    Print #intFreeFile, strTempDocument    Close intFreeFileEnd Sub 
Espero te sirva...
 :comp:

m0skit0:
Hazle caso a Nebire mejor...

cpmario:
Si mejor hazle caso a m0skit0  :beer:

Personalmente no resolvería el caso como mostré en el código anterior. Solo intenté facilitarle las cosas con el código que ya tenías.
Lo ideal para mi, sería colocar un control RichTextBox, abrir el archivo con el RichTextBox.LoadFile introducir las líneas nuevas del log al principio de este control y al finalizar guardar con RichTextBox.SaveFile.
Como ves hay muchas maneras de resolver un problema, como lo resuelvas tu, dependerá de tus conocimientos y tu criterio.

 :comp:

Navegación

[0] Índice de Mensajes

Ir a la versión completa