Underc0de

Programación General => Otros lenguajes => Mensaje iniciado por: BlackBlex en Marzo 04, 2017, 04:17:05 PM

Título: [Cramel] Archivo.cml ~ Lee y escribe archivos | 25 de Junio del 2017
Publicado por: BlackBlex en Marzo 04, 2017, 04:17:05 PM
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:

Para obtener información del archivo están los siguientes metodos:

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) [Seleccionar]
'/**
' * 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) [Seleccionar]
'/**
' * 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) [Seleccionar]
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

Cualquier sugerencia, o error, comenten.
Título: Re:[Cramel] Archivo.cml | Lee y escribe archivos
Publicado por: Riojas en Marzo 04, 2017, 04:23:16 PM
Gracias @BlackBlex (https://underc0de.org/foro/index.php?action=profile;u=26511) por el aporte.
A probarlo!!!
Título: Re:[Cramel] Archivo.cml | Lee y escribe archivos
Publicado por: Yuki en Marzo 08, 2017, 06:23:49 AM
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.
Título: Re:[Cramel] Archivo.cml | Lee y escribe archivos
Publicado por: BlackBlex en Marzo 08, 2017, 10:26:16 AM
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í
Título: Re:[Cramel] Archivo.cml | Lee y escribe archivos
Publicado por: rollth en Mayo 13, 2017, 11:50:12 PM
Actualizado, ahora se pueden abrir varios archivos al mismo tiempo.