• Sábado 21 de Diciembre de 2024, 15:55

Autor Tema:  Escribir al principio de un archivo txt  (Leído 2620 veces)

sysmcn

  • Nuevo Miembro
  • *
  • Mensajes: 18
    • Ver Perfil
Escribir al principio de un archivo txt
« en: Domingo 29 de Marzo de 2009, 15:53 »
0
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

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Escribir al principio de un archivo txt
« Respuesta #1 en: Domingo 29 de Marzo de 2009, 18:59 »
0
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
  1.  
  2. ' a nivel de formulario
  3. dim logs() as string
  4. dim nLogs as long
  5.  
  6. ' al carfgar el formulario en evento load
  7. redim logs(0 to 100)
  8. nlogs=0
  9.  
  10. ' añadir un comentario...
  11. private sub AñadirLog( byval log as string)
  12.     if log <>"" then
  13.           if nlogs =ubound(logs) then
  14.               redim preserve logs(0 to nlogs +100)  ' añadimos 100 'líneas' libres más
  15.          end if
  16.           logs(nlogs)= log
  17.           nlogs=nlogs +1
  18.     end if
  19. end sub
  20.  
  21. ' antes de salir del programa, en el evento queryunload...
  22. ' avisar hay operaciones pendientes de realizar...
  23. if nlogs <> 0 then  ' si se guardaron logs...
  24.     dim n as integer, m as integer
  25.       n=freefile
  26.      open ruta & "nombrelog" & ".tmp" .............
  27.      for k= nlogs to 0 step -1 '  recordar escribirlos en orden inverso....lo que tiene la matriz.
  28.  
  29.          ' escribir linea logs(k)
  30.     next  
  31.     m= freefile
  32.     open ruta & "nombrelog.log" ......
  33.     ' tomar del canal #m
  34.    ' escribir en canal #n  
  35.    close #m
  36.     close #n
  37.     kill ruta & "nombrelog.log"
  38.    ' renombrar nombrelog.tmp a nombrelog.log
  39. end if
  40.  
  41.  
  42.  
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
  1.  
  2. ' a nivel de formulario
  3. dim logs()
  4. dim nLogs as byte
  5.  
  6. ' en load form..
  7. redim logs(0 to 99)
  8. nLogs=0
  9.  
  10. ' rutina del log,  añadir un comentario...
  11. private sub AñadirLog( byval log as string)
  12.     if log <>"" then
  13.           logs(nlogs)= log
  14.           nlogs=nlogs +1
  15.  
  16.           if nlogs = 100 then  '  cuando se llena la matriz...
  17.              ' guardar a fichero los 100 registros... rutina similar a la descrita anteriormente en queryunload...
  18.              ' recordar escribirlos en orden inverso.... o apuntar hacia 99 e ir reduciendo...
  19.  
  20.               redim logs(0 to99)  ' sin, preseve... eliminamos contenido actual
  21.              nLogs=0  ' reiniciamos nueva cuenta...
  22.          end if
  23.     end if
  24. end sub
  25.  
  26. ' en query unload, se investiga, si nlogs es dstinto de 0 hay logs por escribir...
  27.  
  28.  
  29.  
« última modificación: Domingo 29 de Marzo de 2009, 19:32 por Nebire »
«Ma non troppo»
----> ModoVacaciones = False<----

cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: Escribir al principio de un archivo txt
« Respuesta #2 en: Domingo 29 de Marzo de 2009, 19:10 »
0
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
  1. Private Sub Cmd_escribir_log_Click() 'BOTON PARA GUARDAR LOS COMENTARIOS EN ARCHIVOS LOG INDICADO
  2.     Dim lngLenFile As Long
  3.     Dim intFreeFile As Integer
  4.     Dim strLogDocument As String
  5.     Dim strTempDocument As String
  6.    
  7.     On Error Resume Next
  8.     lngLenFile = 0
  9.     intFreeFile = FreeFile
  10.     Open "E:WINDOWSsystem32log" & Txt_nombre_archivo_log For Binary As intFreeFile
  11.     lngLenFile = LOF(intFreeFile)
  12.     strLogDocument = Input(lngLenFile, intFreeFile)
  13.     Close intFreeFile
  14.     'Escribe el comentario al inicio
  15.     strTempDocument = "Fecha:" & Date & " " & "Hora:" & Time & vbNewLine & Txt_comentario & " " & vbNewLine & strLogDocument
  16.    
  17.     intFreeFile = FreeFile
  18.     Open "E:WINDOWSsystem32log" & Txt_nombre_archivo_log For Output As gintFreeFile
  19.     Print #intFreeFile, strTempDocument
  20.     Close intFreeFile
  21. End Sub
  22.  

Espero te sirva...
 :comp:

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Escribir al principio de un archivo txt
« Respuesta #3 en: Domingo 29 de Marzo de 2009, 19:28 »
0
Hazle caso a Nebire mejor...

cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: Escribir al principio de un archivo txt
« Respuesta #4 en: Domingo 29 de Marzo de 2009, 20:21 »
0
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: