Les traigo este código el cual te facilita la escritura y lectura de un archivo.
Información
- Compatible con Cramel: 2.0.0.362
- Librerías requeridas: MSVBVM60.cml
Tiene los siguientes métodos:
- abrir(dirección:Cadena, DesiredAccess, CreationDisposition:Entero) - Abrimos el archivo
- abrir(dirección, modo:Cadena) - Abrimos el archivo
- escribir(texto:Cadena) - Escribimos en el archivo
- leer(texto:Cadena) - Leemos el archivo y establecemos el contenido a texto
- cerrar() - Cerramos el archivo
Para obtener información del archivo están los siguientes metodos:
- conseguirPtr() - Retorna el puntero del archivo
- conseguirNombre() - Retorna el nombre del archivo
- conseguirDirectorio() - Retorna el directorio del archivo
- conseguirExtension() - Retorna la extensión del archivo
- conseguirTamaño() - Retorna el tamaño del archivo en bytes
- esLectura() - Retorna Verdad si el archivo es de lectura
- esEscritura() - Retorna Verdad si el archivo es de escritura
Para usarla solo es de Importar la librería Cramel, Archivo y su archivo de constantes propia; después declaramos una variable del tipo ArchivoC o ArchivoF y creamos el objecto.
Para el parámetro DesiredAccess se puede usar:
GENERIC_WRITE - Para la escritura del archivo. (Reemplaza todo el contenido)
GENERIC_READ - Para la lectura del archivo.
FILE_APPEND_DATA - Para la escritura del archivo. (Escribe al final de este)
Para el parámetro CreationDisposition se puede usar:
OPEN_EXISTING - Abre el archivo solo si existe.
OPEN_ALWAYS - Abre el archivo siempre, sino existe lo crea.
CREATE_NEW - Crea el archivo, si existe marcará error.
CREATE_ALWAYS - Crea un nuevo archivo, si existe lo reescribe.
Para el parámetro modo se puede usar:
r - Para la lectura del archivo, este debe de existir.
w - Para la escritura del archivo, este se crea sino existe o se sobreescribe si existe.
a - Para la escritura del archivo,este se crea sino existe. (Escribe al final de este)
r+ - Para lectura y escritura del archivo, este debe de existir.
w+ - Para lectura y escritura del archivo este se crea sino existe o se sobreescribe si existe.
Y es todo por el momento.
Aquí el código Archivo.cml:
'/**
' * Archivos
' *
' * @author Jovani Pérez Damián (@BlackBlex)
' *
' * ==============Information==============
' * Filename: Archivo.cml
' * ---------------------------------------
'*/
'APIS'
API CDECL fwrite(buffer, size, number, file:Entero):Entero, "msvcrt"
API CDECL fscanf(file:Entero, formato:Cadena, destino:Entero):Entero, "msvcrt"
API CDECL fopen(fileName:Cadena, modo:Cadena):Entero, "msvcrt"
API CDECL fclose(file:Entero):Entero, "msvcrt"
API CDECL fseek(file, offset, origin:Entero):Entero, "msvcrt"
API CDECL ftell(file:Entero):Entero, "msvcrt"
Clase InfoArchivo
Var nombreArchivo:Cadena
Var directorioArchivo:Cadena
Var extensionArchivo:Cadena
Var lecturaArchivo:Booleano
Var escrituraArchivo:Booleano
Var tamañoArchivo:Entero
Var ptrArchivo:Entero
Proc conseguirNombre():Cadena
Resultado = nombreArchivo
FinProc
Proc conseguirDirectorio():Cadena
Resultado = directorioArchivo
FinProc
Proc conseguirExtension():Cadena
Resultado = extensionArchivo
FinProc
Proc conseguirTamaño():Entero
Resultado = tamañoArchivo
FinProc
Proc esLectura():Booleano
Resultado = lecturaArchivo
FinProc
Proc esEscritura():Booleano
Resultado = escrituraArchivo
FinProc
Proc conseguirPtr():Entero
Resultado = ptrArchivo
FinProc
Proc checarApertura():Booleano
Si (ptrArchivo = 0) Entonces
Mensaje("No puedes realizar operaciones si no está abierto el archivo")
Resultado = Falso
SiNo
Resultado = Verdad
FinSi
FinProc
FinClase
Clase ArchivoC(InfoArchivo),_
archivoNombre[],_
archivoExtension[],_
separador,_
texto:Cadena,_
temp:Entero
Destructor:Finalizador
Proc Finalizador
cerrar()
FinProc
Sección Pública
Proc abrir(dirección:Cadena, DesiredAccess, CreationDisposition:Entero)
Si Buscar(dirección, "\\") > 0 Entonces
separador = "\\"
SiNo
separador = "\/"
FinSi
archivoNombre = Separar(dirección, separador)
nombreArchivo = archivoNombre[&archivoNombre-1]
archivoExtension = Separar(nombreArchivo, ".")
extensionArchivo = archivoExtension[&archivoExtension-1]
directorioArchivo = Reemplazar(dirección, separador + nombreArchivo, "")
Si DesiredAccess = GENERIC_READ Entonces
lecturaArchivo = Verdad
escrituraArchivo = Falso
OSi (DesiredAccess = GENERIC_WRITE) Or (DesiredAccess = FILE_APPEND_DATA) Entonces
escrituraArchivo = Verdad
lecturaArchivo = Falso
OSi DesiredAccess = (GENERIC_WRITE + GENERIC_READ) Entonces
escrituraArchivo = Verdad
lecturaArchivo = Verdad
FinSi
ptrArchivo = CreateFile(dirección, DesiredAccess, nulo , nulo, CreationDisposition, FILE_ATTRIBUTE_NORMAL,0)
Si ( ptrArchivo = INVALID_HANDLE ) Entonces
Mensaje("El archivo no pudo ser abierto: " + dirección)
FinSi
tamañoArchivo = GetFileSize(ptrArchivo, nulo)
FinProc
Proc escribir(Referencia txt:Cadena)
Si( checarApertura() = Verdad ) Entonces
Si( escrituraArchivo = Verdad ) Entonces
WriteFile(ptrArchivo, StrPtr(txt), CadLong(txt), temp, nulo)
SiNo
Mensaje("No se permite la escritura cuando el archivo esta abierto como solo lectura.")
FinSi
FinSi
FinProc
Proc leer():Cadena
Si( checarApertura() = Verdad ) Entonces
Si( lecturaArchivo = Verdad ) Entonces
texto = Espacio(tamañoArchivo+1)
ReadFile(ptrArchivo, StrPtr(texto), tamañoArchivo, temp, nulo)
Resultado = texto
SiNo
Mensaje("No se permite la lectura cuando el archivo esta abierto como solo escritura.")
FinSi
FinSi
FinProc
Proc cerrar()
Si ( checarApertura() = Verdad ) Entonces
CloseFile(ptrArchivo)
FinSi
FinProc
FinClase
Clase ArchivoF(InfoArchivo),_
archivoNombre[],_
archivoExtension[],_
separador,_
texto:Cadena,_
temp:Entero
Destructor:Finalizador
Proc Finalizador
cerrar()
FinProc
Sección Pública
Proc abrir(dirección, modo:Cadena)
Si Buscar(dirección, "\\") > 0 Entonces
separador = "\\"
SiNo
separador = "\/"
FinSi
temp = fopen(dirección, "r")
fseek(temp, 0, SEEK_END)
tamañoArchivo = ftell(temp)
fclose(temp)
temp = 0
archivoNombre = Separar(dirección, separador)
nombreArchivo = archivoNombre[&archivoNombre-1]
archivoExtension = Separar(nombreArchivo, ".")
extensionArchivo = archivoExtension[&archivoExtension-1]
directorioArchivo = Reemplazar(dirección, separador + nombreArchivo, "")
Si Buscar(modo, "+") Entonces
lecturaArchivo = Verdad
escrituraArchivo = Verdad
OSi Buscar(modo, "r") Entonces
lecturaArchivo = Verdad
escrituraArchivo = Falso
OSi Buscar(modo, "w") or Buscar(modo, "a") Entonces
lecturaArchivo = Falso
escrituraArchivo = Verdad
FinSi
ptrArchivo = fopen(dirección, modo)
Si ( ptrArchivo = INVALID_HANDLE ) Entonces
Mensaje("El archivo no pudo ser abierto: " + dirección)
FinSi
FinProc
Proc escribir(Referencia txt:Cadena)
Si( checarApertura() = Verdad ) Entonces
Si( escrituraArchivo = Verdad ) Entonces
fwrite(StrPtr(txt), CadLong(txt), 1, ptrArchivo)
SiNo
Mensaje("No se permite la escritura cuando el archivo esta abierto como solo lectura.")
FinSi
FinSi
FinProc
Proc leer():Cadena
Si( checarApertura() = Verdad ) Entonces
Si( lecturaArchivo = Verdad ) Entonces
texto = Espacio(MAX_PATH)
fscanf(ptrArchivo, "%[^" + CRLF + "] " + CRLF, StrPtr(texto))
Resultado = texto
SiNo
Mensaje("No se permite la lectura cuando el archivo esta abierto como solo escritura.")
FinSi
FinSi
FinProc
Proc cerrar()
Si ( checarApertura() = Verdad ) Entonces
fclose(ptrArchivo)
FinSi
FinProc
FinClase
Archivo Constantes.cml <- Se recomienda que tengan un archivo propio de constantes (y que sea global), donde puedan poner todas las constantes que no contenta Cramel por defecto.
'/**
' * Constantes para el archivo
' *
' * @author Jovani Pérez Damián (@BlackBlex)
' *
' * ==============Information==============
' * Filename: Constantes.cml
' * ---------------------------------------
'*/
' File '
Const FILE_ATTRIBUTE_NORMAL = &80
Const FILE_APPEND_DATA = 4
Const SEEK_CUR = 1
Const SEEK_END = 2
Const SEEK_SET = 0
Const FILE_SEEK_OK = 0
Y aquí un ejemplo usando Archivo.cml
Importar "Cramel.cml"
Importar "MSVBVM60\MSVBVM60.cml"
Importar "Constantes.cml"
Importar "Archivo.cml"
Var contenido, salida:Cadena
Var archivoC:ArchivoC
Var tempCad:Cadena
Crear archivoC
archivoC.abrir("D:\BlackBlex_antiguo\Desktop\LogF.txt", GENERIC_READ, OPEN_EXISTING)
contenido = archivoC.leer()
salida = "Nombre del archivo: " + archivoC.conseguirNombre() + CRLF
salida = salida + "Directorio del archivo: " + archivoC.conseguirDirectorio() + CRLF
salida = salida + "Extension del archivo: " + archivoC.conseguirExtension() + CRLF
salida = salida + "Archivo de lectura: " + EntCad(archivoC.esLectura()) + CRLF
salida = salida + "Archivo de escritura: " + EntCad(archivoC.esEscritura()) + CRLF
salida = salida + "Tama\x241o del archivo: " + EntCad(archivoC.conseguirTamaño()) + " bytes" + CRLF
salida = salida + "Puntero: " + EntCad(archivoC.conseguirPtr()) + CRLF
salida = salida + "Contenido: " + contenido
Mensaje(salida)
archivoC.cerrar()
Destruir archivoC
(http://i.imgur.com/EWur4kH.png)
25 de junio del 2017
- Se paso a crear una clase para el manejo de archivos
- Corregido error abrir múltiples archivos.
- Actualizada para la versión 2.0.362 - No funciona en anteriores
Cualquier sugerencia, o error, comenten.
No tienes permitido ver los links.
Registrarse o Entrar a mi cuenta
Te recomiendo que todos los parámetros de tipo cadena que sepas que no se van a modificar sean pasados por referencia, ya que si no estableces la instrucción se copia la cadena que estableces como parámetro y luego es liberada, básicamente se genera código basura que a pesar de tener razón, no sirve para estos casos.
Tienes razón, no sabia que funcionaba así
Actualizado, ahora se pueden abrir varios archivos al mismo tiempo.