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
Escribir en un TXT existente usando API de windows
-
- Al nivel de RZ
- Mensajes: 160
- Registrado: Mar Mar 01, 2011 8:36 pm
- Contactar:
-
- Mensajes: 2
- Registrado: Mié Oct 18, 2017 3:22 pm
- Contactar:
Re: Escribir en un TXT existente usando API de windows
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
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
-
- 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
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!
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!
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 45 invitados