Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

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

  • 4 Respuestas
  • 4360 Vistas

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

Desconectado BlackBlex

  • *
  • Underc0der
  • Mensajes: 49
  • Actividad:
    0%
  • Reputación 4
    • Ver Perfil
  • Skype: blackblex
  • Twitter: 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:
  • 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
  1. '/**
  2. ' * Archivos
  3. ' *
  4. ' * @author  Jovani Pérez Damián (@BlackBlex)
  5. ' *
  6. ' * ==============Information==============
  7. ' *      Filename: Archivo.cml
  8. ' * ---------------------------------------
  9. '*/
  10.  
  11. 'APIS'
  12. API CDECL fwrite(buffer, size, number, file:Entero):Entero, "msvcrt"
  13. API CDECL fscanf(file:Entero, formato:Cadena, destino:Entero):Entero, "msvcrt"
  14. API CDECL fopen(fileName:Cadena, modo:Cadena):Entero, "msvcrt"
  15. API CDECL fclose(file:Entero):Entero, "msvcrt"
  16. API CDECL fseek(file, offset, origin:Entero):Entero, "msvcrt"
  17. API CDECL ftell(file:Entero):Entero, "msvcrt"
  18.  
  19. Clase InfoArchivo
  20.     Var nombreArchivo:Cadena
  21.     Var directorioArchivo:Cadena
  22.     Var extensionArchivo:Cadena
  23.     Var lecturaArchivo:Booleano
  24.     Var escrituraArchivo:Booleano
  25.     Var tamañoArchivo:Entero
  26.     Var ptrArchivo:Entero
  27.    
  28.     Proc conseguirNombre():Cadena
  29.         Resultado = nombreArchivo
  30.     FinProc
  31.  
  32.     Proc conseguirDirectorio():Cadena
  33.         Resultado = directorioArchivo
  34.     FinProc
  35.    
  36.     Proc conseguirExtension():Cadena
  37.         Resultado = extensionArchivo
  38.     FinProc
  39.  
  40.     Proc conseguirTamaño():Entero
  41.         Resultado = tamañoArchivo
  42.     FinProc
  43.  
  44.     Proc esLectura():Booleano
  45.         Resultado = lecturaArchivo
  46.     FinProc
  47.  
  48.     Proc esEscritura():Booleano
  49.         Resultado = escrituraArchivo
  50.     FinProc
  51.  
  52.     Proc conseguirPtr():Entero
  53.         Resultado = ptrArchivo
  54.     FinProc
  55.  
  56.     Proc checarApertura():Booleano
  57.         Si (ptrArchivo = 0) Entonces
  58.             Mensaje("No puedes realizar operaciones si no está abierto el archivo")
  59.             Resultado = Falso
  60.         SiNo
  61.             Resultado = Verdad
  62.         FinSi
  63.     FinProc
  64. FinClase
  65.  
  66. Clase ArchivoC(InfoArchivo),_
  67.     archivoNombre[],_
  68.     archivoExtension[],_
  69.     separador,_
  70.     texto:Cadena,_
  71.     temp:Entero
  72.  
  73.     Destructor:Finalizador
  74.  
  75.     Proc Finalizador
  76.         cerrar()
  77.     FinProc
  78.  
  79.     Sección Pública
  80.         Proc abrir(dirección:Cadena, DesiredAccess, CreationDisposition:Entero)
  81.             Si Buscar(dirección, "\\") > 0 Entonces
  82.                 separador = "\\"
  83.             SiNo
  84.                 separador = "\/"
  85.             FinSi
  86.  
  87.             archivoNombre = Separar(dirección, separador)
  88.             nombreArchivo = archivoNombre[&archivoNombre-1]
  89.             archivoExtension = Separar(nombreArchivo, ".")
  90.             extensionArchivo = archivoExtension[&archivoExtension-1]
  91.             directorioArchivo = Reemplazar(dirección, separador + nombreArchivo, "")
  92.  
  93.             Si DesiredAccess = GENERIC_READ Entonces
  94.                 lecturaArchivo = Verdad
  95.                 escrituraArchivo = Falso
  96.             OSi (DesiredAccess = GENERIC_WRITE) Or (DesiredAccess = FILE_APPEND_DATA) Entonces
  97.                 escrituraArchivo = Verdad
  98.                 lecturaArchivo = Falso
  99.             OSi DesiredAccess = (GENERIC_WRITE + GENERIC_READ) Entonces
  100.                 escrituraArchivo = Verdad
  101.                 lecturaArchivo = Verdad
  102.             FinSi
  103.  
  104.             ptrArchivo = CreateFile(dirección, DesiredAccess, nulo , nulo, CreationDisposition, FILE_ATTRIBUTE_NORMAL,0)
  105.  
  106.             Si ( ptrArchivo = INVALID_HANDLE ) Entonces
  107.                 Mensaje("El archivo no pudo ser abierto: " + dirección)
  108.             FinSi
  109.  
  110.             tamañoArchivo = GetFileSize(ptrArchivo, nulo)
  111.         FinProc
  112.  
  113.         Proc escribir(Referencia txt:Cadena)
  114.             Si( checarApertura() = Verdad ) Entonces
  115.                 Si( escrituraArchivo = Verdad ) Entonces
  116.                     WriteFile(ptrArchivo, StrPtr(txt), CadLong(txt), temp, nulo)
  117.                 SiNo
  118.                     Mensaje("No se permite la escritura cuando el archivo esta abierto como solo lectura.")
  119.                 FinSi
  120.             FinSi
  121.         FinProc
  122.  
  123.         Proc leer():Cadena
  124.             Si( checarApertura() = Verdad ) Entonces
  125.                 Si( lecturaArchivo = Verdad ) Entonces
  126.                     texto = Espacio(tamañoArchivo+1)
  127.                     ReadFile(ptrArchivo, StrPtr(texto), tamañoArchivo, temp, nulo)
  128.                     Resultado = texto
  129.                 SiNo
  130.                     Mensaje("No se permite la lectura cuando el archivo esta abierto como solo escritura.")
  131.                 FinSi
  132.             FinSi
  133.         FinProc
  134.  
  135.         Proc cerrar()
  136.             Si ( checarApertura() = Verdad ) Entonces
  137.                 CloseFile(ptrArchivo)
  138.             FinSi
  139.         FinProc
  140. FinClase
  141.  
  142. Clase ArchivoF(InfoArchivo),_
  143.     archivoNombre[],_
  144.     archivoExtension[],_
  145.     separador,_
  146.     texto:Cadena,_
  147.     temp:Entero
  148.  
  149.     Destructor:Finalizador
  150.  
  151.     Proc Finalizador
  152.         cerrar()
  153.     FinProc
  154.  
  155.     Sección Pública
  156.         Proc abrir(dirección, modo:Cadena)
  157.             Si Buscar(dirección, "\\") > 0 Entonces
  158.                 separador = "\\"
  159.             SiNo
  160.                 separador = "\/"
  161.             FinSi
  162.  
  163.             temp = fopen(dirección, "r")
  164.             fseek(temp, 0, SEEK_END)
  165.             tamañoArchivo = ftell(temp)
  166.             fclose(temp)
  167.             temp = 0
  168.  
  169.             archivoNombre = Separar(dirección, separador)          
  170.             nombreArchivo = archivoNombre[&archivoNombre-1]
  171.             archivoExtension = Separar(nombreArchivo, ".")
  172.             extensionArchivo = archivoExtension[&archivoExtension-1]
  173.             directorioArchivo = Reemplazar(dirección, separador + nombreArchivo, "")
  174.  
  175.             Si Buscar(modo, "+") Entonces
  176.                 lecturaArchivo = Verdad
  177.                 escrituraArchivo = Verdad
  178.             OSi Buscar(modo, "r") Entonces
  179.                 lecturaArchivo = Verdad
  180.                 escrituraArchivo = Falso
  181.             OSi Buscar(modo, "w") or Buscar(modo, "a") Entonces
  182.                 lecturaArchivo = Falso
  183.                 escrituraArchivo = Verdad
  184.             FinSi
  185.  
  186.             ptrArchivo = fopen(dirección, modo)
  187.  
  188.             Si ( ptrArchivo = INVALID_HANDLE ) Entonces
  189.                 Mensaje("El archivo no pudo ser abierto: " + dirección)
  190.             FinSi
  191.  
  192.         FinProc
  193.  
  194.         Proc escribir(Referencia txt:Cadena)
  195.             Si( checarApertura() = Verdad ) Entonces
  196.                 Si( escrituraArchivo = Verdad ) Entonces
  197.                     fwrite(StrPtr(txt), CadLong(txt), 1, ptrArchivo)
  198.                 SiNo
  199.                     Mensaje("No se permite la escritura cuando el archivo esta abierto como solo lectura.")
  200.                 FinSi
  201.             FinSi
  202.         FinProc
  203.  
  204.         Proc leer():Cadena
  205.             Si( checarApertura() = Verdad ) Entonces
  206.                 Si( lecturaArchivo = Verdad ) Entonces
  207.                     texto = Espacio(MAX_PATH)
  208.                     fscanf(ptrArchivo, "%[^" + CRLF + "] " + CRLF, StrPtr(texto))
  209.                     Resultado = texto
  210.                 SiNo
  211.                     Mensaje("No se permite la lectura cuando el archivo esta abierto como solo escritura.")
  212.                 FinSi
  213.             FinSi
  214.         FinProc
  215.  
  216.         Proc cerrar()
  217.             Si ( checarApertura() = Verdad ) Entonces
  218.                 fclose(ptrArchivo)
  219.             FinSi
  220.         FinProc
  221. 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: Text
  1. '/**
  2. ' * Constantes para el archivo
  3. ' *
  4. ' * @author  Jovani Pérez Damián (@BlackBlex)
  5. ' *
  6. ' * ==============Information==============
  7. ' *      Filename: Constantes.cml
  8. ' * ---------------------------------------
  9. '*/
  10.  
  11. ' File '
  12. Const FILE_ATTRIBUTE_NORMAL = &80
  13. Const FILE_APPEND_DATA = 4
  14. Const SEEK_CUR = 1
  15. Const SEEK_END = 2
  16. Const SEEK_SET = 0
  17. Const FILE_SEEK_OK = 0

Y aquí un ejemplo usando Archivo.cml

Código: Text
  1. Importar "Cramel.cml"
  2. Importar "MSVBVM60\MSVBVM60.cml"
  3. Importar "Constantes.cml"
  4. Importar "Archivo.cml"
  5.  
  6. Var contenido, salida:Cadena
  7. Var archivoC:ArchivoC
  8. Var tempCad:Cadena
  9.  
  10. Crear archivoC
  11. archivoC.abrir("D:\BlackBlex_antiguo\Desktop\LogF.txt", GENERIC_READ, OPEN_EXISTING)
  12.  
  13. contenido = archivoC.leer()
  14.  
  15. salida = "Nombre del archivo: " + archivoC.conseguirNombre() + CRLF
  16. salida = salida + "Directorio del archivo: " + archivoC.conseguirDirectorio() + CRLF
  17. salida = salida + "Extension del archivo: " + archivoC.conseguirExtension() + CRLF
  18. salida = salida + "Archivo de lectura: " + EntCad(archivoC.esLectura()) + CRLF
  19. salida = salida + "Archivo de escritura: " + EntCad(archivoC.esEscritura()) + CRLF
  20. salida = salida + "Tama\x241o del archivo: " + EntCad(archivoC.conseguirTamaño()) + " bytes" + CRLF
  21. salida = salida + "Puntero: " + EntCad(archivoC.conseguirPtr()) + CRLF
  22. salida = salida + "Contenido: " + contenido
  23. Mensaje(salida)
  24.  
  25. archivoC.cerrar()
  26. 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.
« Última modificación: Junio 26, 2017, 12:50:47 am por BlackBlex »

Desconectado Riojas

  • *
  • Underc0der
  • Mensajes: 59
  • Actividad:
    0%
  • Reputación 4
  • -RIOJAS
    • Ver Perfil
    • Arduino Center
    • Email
« Respuesta #1 en: Marzo 04, 2017, 04:23:16 pm »
Gracias @BlackBlex por el aporte.
A probarlo!!!

Desconectado Yuki

  • *
  • Underc0der
  • Mensajes: 67
  • Actividad:
    0%
  • Reputación 5
    • Ver Perfil
« Respuesta #2 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.

Desconectado BlackBlex

  • *
  • Underc0der
  • Mensajes: 49
  • Actividad:
    0%
  • Reputación 4
    • Ver Perfil
  • Skype: blackblex
  • Twitter: blackblex
« Respuesta #3 en: Marzo 08, 2017, 10:26:16 am »
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í

Desconectado rollth

  • *
  • Underc0der
  • Mensajes: 876
  • Actividad:
    0%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« Respuesta #4 en: Mayo 13, 2017, 11:50:12 pm »
Actualizado, ahora se pueden abrir varios archivos al mismo tiempo.

 

¿Te gustó el post? COMPARTILO!



[Código-Haskell] Cuenta caracteres de un archivo - JaAViEr

Iniciado por JaAViEr

Respuestas: 0
Vistas: 2181
Último mensaje Julio 17, 2011, 03:33:33 am
por JaAViEr
[Código-Haskell] Limpia Archivo - JaAViEr

Iniciado por JaAViEr

Respuestas: 0
Vistas: 2162
Último mensaje Julio 17, 2011, 03:40:07 am
por JaAViEr
[Cramel] Brute Force Dictionary Creator by 79137913 [Aplicación + Source]

Iniciado por BlackBlex

Respuestas: 0
Vistas: 3591
Último mensaje Julio 01, 2017, 07:04:10 pm
por BlackBlex
[Cramel] Regedit.cml ~ Crea, Edita y Elimina claves del Registro

Iniciado por BlackBlex

Respuestas: 0
Vistas: 3542
Último mensaje Julio 05, 2017, 08:30:39 pm
por BlackBlex
[Cramel] Obtener Nombre del Sistema Operativo

Iniciado por fudmario

Respuestas: 2
Vistas: 2379
Último mensaje Marzo 01, 2017, 11:39:18 pm
por fudmario