BotonMenu
BotonIndice

Visita : conoce3000.com
Paypal : https://www.paypal.com/donate/?hosted_button_id=XY8TZ3MGN64GE

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


9. ARCHIVOS.
9.6. RUTINAS DE ARCHIVOS CON UN MANEJADOR DE ARCHIVO.
9. ARCHIVOS.
9.6. RUTINAS DE ARCHIVOS CON UN MANEJADOR DE ARCHIVO.
9. ARCHIVOS.
9.6. RUTINAS DE ARCHIVOS CON UN MANEJADOR DE ARCHIVO.

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ Rutinas de archivos con un manejador de archivo.

Estas rutinas son similares en funcionamiento a las rutinas que se usan con los archivos sin tipo, con la salvedad de que para la escritura y lectura se hace directamente sin usar bloques de bytes, es decir al momento de escribir o leer se debe indicar la cantidad de bytes que queramos leer o escribir en el archivo; otra diferencia es que usan una variable de tipo longword como manejador de archivo y no usan la palabra reservada Text o File. Con estas rutinas todos los archivos son considerados una colección de bytes independientemente si son archivos de texto o archivos con tipo. Estas rutinas se encuentran en la unidad sysutils y son: FileCreate y FileOpen que permiten crear un archivo y abrir un archivo respectivamente, Filewrite y Fileread son rutinas para la escritura y lectura, Fileclose nos permite cerrar un archivo abierto, y finalmente las rutinas Fileseek y Filetruncate, que nos permite mover el puntero del archivo y truncar un archivo.

FileCreate, nos permite crear el archivo colocando en su parámetro el nombre que tendrá en el disco, este nombre en los sistemas operativos Windows debe estar en ASCII o una de sus variantes ANSI. La función abre el archivo tanto para lectura y escritura y devuelve un manejador de archivo que es un número de tipo longword, para ser usado con filewrite, fileread, fileseek, fileclose y filetruncate. Si se usa Filecreate con un archivo que existe este se sobrescribe borrando su contenido anterior.

FileOpen, nos permite abrir un archivo existente, colocando como primer parámetro el nombre del archivo y en su segundo parámetro una de las siguientes opciones de apertura:

fmOpenRead Abre el archivo sólo para lectura.
fmOpenWrite Abre el archivo sólo para escritura.
fmOpenReadWrite Abre el archivo para lectura y escritura.

Las opciones o modos de apertura se pueden combinar usando el operador or con las opciones o modos para compartir archivos, siguientes:

fmShareExclusive Otros programas no pueden abrir el archivo. Es decir bloquea el archivo para uso exclusivo por el programa.
fmShareDenyWrite Otros programas pueden abrir el archivo sólo para lectura pero no para escritura. Es decir bloquea el archivo evitando que otros programas puedan escribir sobre él.
fmShareDenyRead Otros programas pueden abrir el archivo sólo para escritura pero no para lectura. Es decir bloquea el archivo permitiendo que otros programas puedan sobrescribirlo pero no pueden hacer una lectura. Esta opción sólo funciona con Windows en Linux es ignorado.
fmShareDenyNone Permite que otros programas puedan abrir el archivo para escritura y lectura. Esta opción sólo funciona con Windows en Linux es ignorado.

fmShareExclusive y fmShareDenyWrite, no funcionan en Linux, de la misma manera como lo hacen en Windows, esto debido a que Linux ofrece un bloqueo de archivos con indicadores no estrictos (Advisory file lock) y Windows trabaja con un bloqueo de archivos con indicadores estrictos (Mandatory file lock). Es decir en Linux si abrimos un archivo con fmShareExclusive y si luego otro programa intenta abrir el archivo, este puede ignorar los indicadores que le dicen que es de uso exclusivo y sobreescribir el archivo, pero si el otro programa está usando fileopen entonces esta función si respetará los indicadores devolviendo -1 como error de apertura. Es decir las opciones fmShareExclusive y fmShareDenyWrite para compartir archivos en Linux, sólo funciona entre programas que usen la funcion FileOpen o respeten los indicadores de bloqueo de archivos.

Al igual que filecreate, la función fileopen devuelve un manejador de archivo, y el nombre del archivo que se coloca en su primer parámetro, debe estar en ASCII o una de sus variantes ANSI en los sistemas operativos Windows.

FileRead, esta función tiene tres parámetros, el primero es el manejador de archivo que se obtiene con las funciones fileopen y filecreate, el segundo parámetro es la variable que recibirá los datos leídos desde el archivo, que generalmente es un arreglo, y el último parámetro es la cantidad de bytes que se leerán desde el disco. La función devuelve la cantidad de bytes leídos o -1 si sucede un error. Cada vez que se hace una lectura con FileRead este mueve el puntero de archivo al siguiente byte, de todos los bytes que se hayan leído. Es decir si el puntero de archivo estaba en el byte 15 del archivo, y se hace una lectura de 10 bytes, entonces el puntero de archivo se moverá al byte 25.

FileWrite, esta función también tiene tres parámetros, el primero es el manejador de archivo que se obtiene con las funciones fileopen y filecreate, el segundo parámetro es la variable que contiene los datos a escribir, y el tercero la cantidad de bytes a escribir en el archivo. La función devuelve el número de bytes escritos al archivo o -1 si sucede un error. Al igual que FileRead, esta función también mueve el puntero de archivo al siguiente bytes de todos los bytes escritos.

FileClose, sólo tiene un parámetro y es el manejador de archivo, y nos permite cerrar el archivo.

El siguiente Ejemplo, es un programa que nos permite guardar un arreglo de 10 enteros y luego mostrarlos por pantalla.


Descargar
{$codepage utf8}
{$ifdef win32}
  Uses sysutils;
{$endif}
{$ifdef Unix}
  Uses sysutils,cwstring; 
{$endif}

Var Arch:longint;
    NombreArch:Unicodestring;
    b:array [1..10] of longint;
    i:byte;
Begin
  NombreArch:='numeros.dat';  

  {$ifdef Unix}   
  NombreArch:='の番号.dat';  
  {$endif}   
  NombreArch:=SetDirSeparators(NombreArch);  

  Arch:=FileCreate(NombreArch);
  Randomize;
  for i:=1 to 10 do b[i]:=random(1000); 
  
  FileWrite(Arch,b,SizeOf(longint)*10); //graba los diez numeros
  FileClose(Arch);  
  
  Arch:=FileOpen(NombreArch,fmOpenReadWrite);
  FileRead(Arch,b,SizeOf(longint)*10); //lee los diez numeros  
  for i:=1 to 10 do Writeln(b[i]);
  
  FileClose(Arch);  
  
End.
Código fuente 16: Rutinas de archivos con manejador de archivo. FileCreate, FileWrite, FileClose, FileOpen, FileRead.
Descargar

El ejemplo anterior crea un archivo que contiene sólo números enteros, generados aleatoriamente. Lo primero que se debe observar del ejemplo es que para grabar o leer, se hace uso de la función SizeOf, este nos permite saber el tamaño en bytes del tipo longint para luego multiplicarlo por 10, y así obtener la cantidad de bytes que se grabarán y leerán en el archivo.

Para hacer una lectura con Fileread, como se puede observar en el ejemplo anterior se tuvo que cerrar el archivo con fileclose para después abrirlo con fileopen, esto se hizo porque al hacer la escritura con Filewrite, el puntero de archivo se mueve al final del archivo, y cada vez que se abre un archivo con FileOpen, el puntero de archivo se moverá al inicio. Esto se pudo haber evitado haciendo uso de la función fileseek.

Fileseek, es una función que tiene tres parámetros el primero de ellos es el manejador de archivo, el segundo la cantidad de bytes a desplazar, y el tercero el origen del desplazamiento. El origen de desplazamiento puede ser una de las siguientes opciones:

fsFromBeginning Permite mover el puntero de archivo, desde el inicio del archivo la cantidad de bytes indicado en su segundo parámetro. La cantidad de bytes a mover debe ser siempre un número positivo o 0.
fsFromCurrent Permite mover el puntero de archivo, desde la posición actual del puntero de archivo la cantidad de bytes indicado en su segundo parámetro. La cantidad de bytes puede ser un número positivo o negativo, si es un número positivo entonces el puntero de archivo se moverá hacia a delante, y si es negativo hacia atrás.
fsFromEnd Permite mover el puntero de archivo, desde el final del archivo la cantidad de bytes indicado en su segundo parámetro. La cantidad de bytes a mover siempre debe ser un número negativo o 0.

Al mover el puntero de archivo, se debe tener cuidado de no pasar el inicio y final del archivo, ya que esto puede ocasionar problemas, la función fileseek no hace ningún tipo de comprobación al respecto. Si la función tiene éxito, esta devuelve la nueva posición del puntero de archivo, en otro caso devuelve -1.

Si queremos saber la posición actual del puntero de archivo, sólo se debe usar la siguiente instrucción, Fileseek(Arch,0,fsFromCurrent), para mover el puntero de archivo, al inicio del archivo se usa lo siguiente Fileseek(Arch,0,fsFromBeginning), pero si queremos moverlo al final se usa, Fileseek(Arch,0,fsFromEnd).

Una manera de saber el tamaño en bytes de un archivo es obtener la posición del puntero del archivo cuando este se encuentre al final, para eso simplemente movemos el puntero al final del archivo con FileSeek(Arch,0,fsFromend), y el valor devuelto por la función será el tamaño en bytes del archivo.

El siguiente ejemplo, es el mismo que el anterior pero esta vez hace uso de fileseek, para mover el puntero de archivo al inicio del archivo.


Descargar
{$codepage utf8}
{$ifdef win32}
  Uses sysutils;
{$endif}
{$ifdef Unix}
  Uses sysutils,cwstring; 
{$endif}

Var Arch:longint;
    NombreArch:Unicodestring;
    b:array [1..10] of longint;
    i:byte;
Begin
  NombreArch:='numeros.dat';  

  {$ifdef Unix}   
  NombreArch:='の番号.dat';  
  {$endif}   
  NombreArch:=SetDirSeparators(NombreArch);  

  Arch:=FileCreate(NombreArch);
  Randomize;
  for i:=1 to 10 do b[i]:=random(1000); 
  
  FileWrite(Arch,b,SizeOf(longint)*10); //graba los diez numeros


  FileSeek(Arch,0,fsFromBeginning);  
  

  FileRead(Arch,b,SizeOf(longint)*10); //lee los diez numeros  
  for i:=1 to 10 do Writeln(b[i]);
  
  FileClose(Arch);  
  
End.
Código fuente 17: Uso de FileSeek.
Descargar

Estas rutinas también se pueden usar para sacar un copia de cualquier archivo, tal como se hizo con los archivos sin tipo, a continuación el ejemplo:


Descargar
{$codepage utf8}
{$ifdef win32}
   Uses sysutils;
{$endif}
{$ifdef Unix}
   Uses sysutils,cwstring;
{$endif}
 var
   Arch01,Arch02: longint;
   BytesLeidos,BytesEscritos: longint;
   NombreArch01,NombreArch02: String;
   B: array[1..2048] of byte; 
 begin
   Write('Nombre del archivo a copiar: ');
   ReadLn(NombreArch01);
   Write('Nuevo nombre del archivo copiado: ');
   ReadLn(NombreArch02);
   Arch01:=FileOpen(NombreArch01,fmOpenReadWrite);
   Arch02:=FileCreate(NombreArch02);
   repeat
     BytesLeidos:=FileRead(Arch01,B,2048);
     BytesEscritos:=FileWrite(Arch02,B,BytesLeidos);
     Write('.')
   until (BytesLeidos = 0) or (BytesEscritos <> BytesLeidos);
   FileClose(Arch01);
   FileClose(Arch02);
 end.
Código fuente 18: Uso de las rutinas de archivos con un manejador de archivo, para copiar o duplicar cualquier archivo.
Descargar

FileRead siempre hará una lectura de 2048 bytes que es el tamaño de la variable B aunque el archivo sea de menor tamaño que este, la cantidad real de bytes leídos se almacena en la variable BytesLeidos y el procedimiento FileWrite usará la variable BytesLeidos, para escribir dicha cantidad de bytes en el nuevo archivo.

Ambos procedimientos se encuentran dentro de un bucle Repeat, este bucle finalizará cuando BytesLeidos tenga el valor 0 que indica que ya no se pudieron leer más bytes del archivo a copiar, o cuando se produce un error de escritura es decir cuando los BytesLeidos y BytesEscritos no coincidan. Al final se cierran ambos archivos.

La función FileTruncate, es una rutina que nos permite borrar el contenido del archivo, reservando una cantidad de bytes desde el inicio del archivo y no desde la posición actual del puntero de archivo. Si la operación tiene éxito este devuelve true caso contrario devuelve false. A continuación un Ejemplo:


Descargar
{$codepage utf8}
{$ifdef win32}
   Uses sysutils;
{$endif}
{$ifdef Unix}
   Uses sysutils,cwstring;
{$endif}

Var
   Arch:Longint;
   b:array [0..10] of longint;   
   i:integer;
   BytesEscritos:longint;    
Begin
   Arch:=FileCreate('numeros.dat');
   {$ifdef Unix}
   Arch:=FileCreate('の番号.dat');
   {$endif}

   Writeln('Creando el archivo');      
   for i:=0 to 10 do b[i]:=i;
   BytesEscritos:=FileWrite(Arch,b,SizeOf(longint)*11);        
   

   if BytesEscritos=SizeOf(longint)*11 then 
    Begin   
     Writeln('Mostrando');	 
     FileSeek(Arch,0,fsFromBeginning);
     FileRead(Arch,b,BytesEscritos);
     for i:=0 to 10 do Writeln(b[i]); 
       
     Writeln('Truncando hasta 5');	    
     FileTruncate(Arch,SizeOf(longint)*5);
  
     FileSeek(Arch,0,fsFromBeginning);
     FillDWord(b,11,-1);
     FileRead(Arch,b,SizeOf(longint)*11);   
     for i:=0 to 10 do Writeln(b[i]); 
   End;    
   FileClose(Arch)
End.
Código fuente 19: Ejemplo del uso de FileTruncate.
Descargar

Los ejemplos o anteriores hacen uso de arreglos estáticos pero también se pueden usar arreglos dinámicos, y se debe usar el primer elemento del arreglo y no la variable, con las funciones FileRead y FileWrite. Ejemplo:


Descargar
{$codepage utf8}
{$ifdef win32}
   Uses sysutils;
{$endif}
{$ifdef Unix}
   Uses sysutils,cwstring;
{$endif}

Var
   Arch:Longint;
   b:array of longint;      
   i:integer;
   BytesEscritos:longint;    
Begin
   SetLength(b,10);
   Arch:=FileCreate('numeros.dat');
   {$ifdef Unix}
   Arch:=FileCreate('の番号.dat');
   {$endif}

   Writeln('Creando el archivo');      
   for i:=0 to 10 do b[i]:=i;
   BytesEscritos:=FileWrite(Arch,b[0],SizeOf(longint)*11);        
   
   Writeln('Mostrando');	 
   if BytesEscritos=SizeOf(longint)*11 then 
    Begin   
     FileSeek(Arch,0,fsFromBeginning);
     FileRead(Arch,b[0],BytesEscritos);
     for i:=0 to 10 do Writeln(b[i]); 
       
     Writeln('Truncando hasta 5');	    
     FileTruncate(Arch,SizeOf(longint)*5);
  
     FileSeek(Arch,0,fsFromBeginning);	 
     FillDWord(b[0],11,-1);
     FileRead(Arch,b[0],SizeOf(longint)*11);   
     for i:=0 to 10 do Writeln(b[i]); 
   End;    
   FileClose(Arch)
End.
Código fuente 20: Ejemplo del uso de arreglos dinámicos.
Descargar

Lo mismo sucede con las variables de tipo String, Ansistring y Unicodestring, en donde se debe colocar el primer carácter de esa variable, es decir si la variable Nombre de tipo unicodestring, se desea usar con FileRead o FileWrite, a estas funciones sólo se debe usar el primer carácter que sería: Nombre[1].




SIGUIENTE
SIGUIENTE
SIGUIENTE


 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo a través de , que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado. Para clases particulares contactame por whatsapp al 📲 (+51) 999 264 073








PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia : Creative Commons Reconocimiento-NoComercial 3.0 Unported License.