Publicidad en el foro

Quiero anunciarles que a modo de prueba he habilitado anuncios de Adsense en el foro. La idea es ver si con ellos se puede solventar, de alguna manera, el costo que conlleva mantener el foro ya que el dominio y el servidor no son gratis.
También he agregado un botón de Donate en el menú, por si alguien se siente incentivado a colaborar :)

Espero que no tomen a mal esto, más que nada es una especie de experimento dado que siempre me pregunté si estas cosas sirven para solventar los gastos operativos que ya llevo 7 años pagando.

Si dentro de unos meses me compro una Ferrari, se los diré :)

Escribir en un TXT existente usando API de windows

Consultas, trucos, consejos. Todo sobre Clarion en todas sus versiones
Responder
duenda
Al nivel de RZ
Mensajes: 114
Registrado: Mar Mar 01, 2011 8:36 pm
Contactar:

Escribir en un TXT existente usando API de windows

Mensaje por duenda » Mar Sep 26, 2017 4:47 pm

Hola Gente!

Siempre que he necesitado escribir en archivos de texto, uso las API de windows, declaradas en el MAP:

MODULE('Windows API')
_lopen(*CSTRING,SIGNED),SIGNED,PASCAL,RAW
_lread(SIGNED, *CSTRING, SIGNED),SIGNED,PASCAL,RAW
_lcreat(*CSTRING,SIGNED),SIGNED,PASCAL,RAW
_hwrite(SIGNED,*CSTRING,LONG),LONG,PASCAL,RAW
_lclose(SIGNED),SIGNED,PASCAL
END

Hasta ahora la secuencia usada siempre ha sido:

F# = _lcreat(NombreArchivo,0)
X# = _hwrite(F#,Texto,LEN(Texto))
X# = _lclose(F#)

Pero el _lcreat CREA el archivo de cero como su nombre lo indica, sin importar si el mismo tiene o no contenido.

Lo que necesito hacer es verificar si el archivo existe (esto lo hago con el IF EXISTS) y en caso de que ya esté creado agregarle más lineas. Eso no sería un problema si en lugar de F# uso una variable global al crearlo que usaré luego al escribir... pero si cierro el programa, al abrirlo nuevamente pierdo el dato.

He añadido las funciones _lopen y _lread que nunca antes había usado y encontré en algún tutorial web pero no me funcionan:

F# = _lopen(NombreArchivo,0)
Texto='estoy intentando escribir en el archivo abierto'
X# = _hwrite(F#,Texto,LEN(Texto))

pero no escribe nada... gracias por cualquier ayuda! Ileana


botserver
Mensajes: 2
Registrado: Mié Oct 18, 2017 3:22 pm
Contactar:

Re: Escribir en un TXT existente usando API de windows

Mensaje por botserver » Jue Oct 19, 2017 12:56 pm

Module('WinApi')
CloseHandle(LONG),LONG, PASCAL, PROC
CreateFile(*CSTRING, LONG, LONG, LONG, LONG, LONG, LONG ),LONG, NAME('CreateFileA'), PASCAL, RAW
WriteFile(LONG hFile, *CSTRING lpBuffer, LONG nNumberOfBytesToWrite, *LONG lpNumberOfBytesWritten, LONG lpOverlapped), BOOL, RAW, PASCAL
End



LogToFile PROCEDURE (archivo,dato)



CREATE_NEW EQUATE(1)
FILE_ATTRIBUTE_NORMAL EQUATE(128)
OPEN_EXISTING EQUATE(3)
FILE_APPEND_DATA EQUATE(00004h)
FILE_SHARE_READ EQUATE(00000001h)
PathArchivoTXT CSTRING(255)
BufferArchivo CSTRING(10000)


PathArchivoTXT = Clip(archivo)
a# = CreateFile(PathArchivoTXT, FILE_APPEND_DATA, FILE_SHARE_READ, 0, CREATE_NEW + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
iF a# Then
BufferArchivo = Format(Today(), @d06 ) & ' ' & Format(Clock(), @t4) & ' ' & Clip(Dato) & Chr(13) & Chr(10)
WriteFile(a#, BufferArchivo, Len(Clip(BufferArchivo)), temp#, 0)
CloseHandle(a#)
End

duenda
Al nivel de RZ
Mensajes: 114
Registrado: Mar Mar 01, 2011 8:36 pm
Contactar:

Re: Escribir en un TXT existente usando API de windows

Mensaje por duenda » Jue Oct 19, 2017 1:15 pm

Muchas gracias!

En principio, ya modifiqué mi código agregando una tabla ASCII al DCT, pero está bueno no tener que depender de esto, así que lo voy a probar ni bien pueda!

Saludos!


Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 2 invitados