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
FinClaseArchivo 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 = 0Y 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.
Muy copada la libreria, aunque personalmente prefiero CreateFile de Win32 ;D
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.
You are not allowed to view links.
You are not allowed to view links.
Register or Login or You are not allowed to view links.
Register or Login
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í