[Cramel] Archivo.cml ~ Lee y escribe archivos | 25 de Junio del 2017

Iniciado por BlackBlex, Marzo 04, 2017, 04:17:05 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Marzo 04, 2017, 04:17:05 PM Ultima modificación: Junio 26, 2017, 12:50:47 AM por BlackBlex
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:

Código: text
'/**
' * 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.
Código: Cramel
'/**
' * 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

Código: text
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




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.

Gracias @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta por el aporte.
A probarlo!!!

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.

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.
RollthBuen hacker mejor No tienes permitido ver los links. Registrarse o Entrar a mi cuenta/No tienes permitido ver los links. Registrarse o Entrar a mi cuenta