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: 160
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: 160
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