El post que buscas se encuentra eliminado, pero este también te puede interesar

Como Manejar Archivo sin Tipo en Delphi..

Anuncios

Archivos Sin Tipo


Los archivos sin tipo son canales de E/S de bajo nivel, principalmente utilizados para acceso directo a cualquier archivo de disco con independencia del tipo y estructura.

Como se declara, en delphi?


Una forma es :

1 - type archivo:file of byte;

Otra forma es :

2 - type archivo:file;

1 - Como abrir un file of byte


Lo que se hace primero con todo archivo es decir su ubicacion logica

assingfile(archivo,'archivo.txt');

Para abrirlo por primera vez se usa rewrite

rewrite(archivo);

Si el archivo ya existe usas reset:

reset(archivo);

Que cambia con respecto a los otros tipos de archivos que cuentan con una estructura declarada?


Asta ahora ven que no cambia en nada. Lo interesante viene ahora que es lo referido a su manejo
Como no tiene estructura cuando queres traer informacion del archivo a la RAM tenes que especificarle cuantos
bytes queres que traiga. De esta manera el READ que se usaba antes ahora se le agrega una palabra mas
y lo cambiamos por READBLOCK y los parametros que le mandamos son:
- el archivo
- un buffer que es en el que se va a guardar temporalmente la informacion
- y la cantidad de caracteres que queremos que recupere y coloque en el buffer
hay un cuarto parametro que indica si pudo leer todos los bytes que queriamos que leyera pero no es muy necesario; de hecho es opcional de manera que puede NO ponerse.
El archivo va a ser (obio) del tipo "file of byte"
el buffer va a ser un ARREGLO DE BYTES
el que especifica la cantidad de caracteres va a ser del tipo integer
y queda declarado asi:

TYPE
archivo= file of byte;
arrayofbyte= array[0..1023] of byte;
VAR
filesintipo : archivo;
buffer : arrayofbyte;
cantidadarecuperar : integer;


antes de pasar al REABLOCK y el WRITEBLOCK y como pasar los byte del buffer a un string quiero mostrar como estan guardados las cosas. Bueno en el archivo sin tipo vos guardaste un nombre, suponete "fulanito de tal" con un numero de telefono "teléfono" y una direccion "dirección" de esta forma

Archivo sin tipo :
"fulanito de taltelefonodireccion" // cantidad de caracteres 32

Osea se guarda todo junto. y en formato byte (1) - piensen que por cada letra y espacio hay dos bytes y reemplazenlo -

Haciendo el READBLOCK

READBLOCK ( filesintipo, buffer , 32 )


El buffer se va a llenar de informacion asta la posición 32 * 2 = 64. Ahora tenemos un buffer lleno de bytes asta la posicion 63 - ya que declaramos el arreglo a partir de la posicion 0 - que tenemos que pasar a un string para que sea legible para nosotros. usamos esta función, ya esta dentro de la biblioteca de DELPHI estandar y es : (primero también inicializamos el string)

Declaramos el string antes ----> Var s : string;

SetLength(S, High(V));

// inicializamos el String --->funcion para inicializar. Tambien esta en la biblioteca Estandar de Delphi
//ahora movemos la info del buffer al string

Move(Buffer[0] , S[1], High(Buffer)); // transfiriendo...

Antes de pasar al WRITEBLOCK voy a explicar como posicionarse en algun lugar en especial del archivo con la funcion Seek ( filesintipo , posicion );
- Bien. La función es la misma pero la forma en que se obtiene la posición es diferente
Para ser consistente con la información que hay en el archivo, lo mas conveniente es que siempre leamos la misma cantidad de caracteres Esta parte es importante sino no vamos a saber cuando termina una parte de una información y cuando empieza otra - ya no seria información seria otra cosa que ya no nos serviría
De manera que el archivo sin tipo para nosotros estaría organizado por bloque de esta manera

Archivo sin tipo = {bloque0[64 bytes]boque1[64 bytes]boque2[64 bytes].....bloqueN[64 bytes]}

Para el archivo son todos bytes uno al lado del otro no hay un limite en el que termina un bloque y empieza otro no hay estructura. La Estructura se moldea por la forma en que nosotros manipulamos el archivo.
Siguiendo este razonamiento si queremos acceder al bloque 3 entonces multiplicamos 3 * la cantidad de caracteres que componen cada bloque osea -----> 3 * 32 caracteres entonces estamos en el byte numero 96 a partir de alli
leemos 32 caracteres o lo que lo mismo 64 bytes

posicion = 3 * 32;
Seek ( filesintipo , posicion );

Ahora estamos parados en el byte numero 96. A partir de ahi leemos 32 caracteres o 64 bytes que se colocan en el buffer luego pasamos la informacion del arreglo de bytes al string, con la funcion que ya mostre arriba. De esta manera manipulas el archivo como si estuviera formado por bloques de 64 bytes

ATENCION : Suponete que escribiste en el bloque 0 en el 1 y en el 2. El tamaño de nuestro archivo va a ser (2*32) + 32 = 96 = 192 bytes. El "+32" es porque nuestro primer bloque es el bloque 0, no el bloque 1. Haber osea, si te queres posicionar en el bloque 0 haces 0*32 =0 entonces se posiciona en el byte 0 y lees 32 caracteres = 64 bytes. Entonces el tamaño de tu archivo va a ser (0*32)+32=32 = 64 bytes , porque ya escribiste 32 caracteres = 64 bytes. Espero se haya entendido esta parte. Bueno sigo, Estaba en que el tamaño del archivo era 96 * 2 = 192 bytes (1 caracter = 2 bytes) Si vas a leer el archivo cuando quiera leer un bloque tenes que fijarte que este exista ya que si vos te queres posicionar en el bloque 10 que seria haciendo calculos 10*32 =320 = 640 bytes, en el Byte 640 pero nunca escribiste en esta parte del archivo te saldra un error. Por lo que a la hora de Leer fijate que el tamaño del archivo sea mayor a la posicion donde queres hacer el Seek
seria algo asi como :

- si posicion< tamanioarchivo(filesintipo) entonces
- leer
- sino
- no leer

Bueno Ahora si pasamos al Writeblock, seria algo asi:

Writeblock( filesintipo , bloque , 32 caracteres) ; {lo de "caracteres" esta demás lo pongo para q se entienda mejor eso espero }

Antes tenes que guardar en un String los datos - solo asta 32 caracteres no mas - Acuerdense que es para mantener la consistencia luego lo pasas al arreglo con esta funcion --

Antes hay que inicializar el arreglo

ZeroMemory(@Buffer[0], High(Buffer)); //inicializando arreglo - esta función esta en las librerias estandar de delphi
StrPLCopy(@Buffer[0], S, High(Buffer)); // luego copiamos en el arreglo

y ahora escribimos. Si es en un bloque en especial nos posicionamos antes.

Seek(archivo, numerodebloque * tamaniodelbloque);

Si queremos posicionarnos al final del archivo para escribir hacemos

Seek( archivo, tamanioarchivo(archivo));

Writeblock(filesintipo, buffer, 32);

Nota : A la hora de escribir no hay ningun problema. Solo existe el problema a la hora de Leer un byte que nunca se escribio antes.

Bueno, el post está bajo corrección ya que es el primero que hago. Acepto sugerencias y mejoras en el mismo para su modificación. En fin Saludos!

Nota : El 2 - filesintipo : file; No lo voy a explicar ya que no se como usarlo. Solo aprendí a manejar el primero

(1) - creo que la expresion no es la correcta. A los fines explicativos no es muy importante

Fuentes : http://sistemas.itlp.edu.mx/tutoriales/pascal/u8_8_9.html
http://delphiallimite.blogspot.com/2007/08/trabajando-con-archivos-de-texto-y_30.html

Anuncios

3 comentarios - Como Manejar Archivo sin Tipo en Delphi..

@blackjaguar2000
y que pasa si no conozco el tamaøo del buffer pero si conozco el tamano del archivo?
@xixtech
Hola chicos, como andan?
Les cuento que tenemos una búsqueda para programadores Delphi, con 2 años de experiencia minmo, ingles medio, para trabajar en una multinacional dedicada al desarrollo de software, con oficinas en Nuñez, Capital Federal, de lunes a viernes de 9 a 18, con flexibilidad horaria. El modo de contratacion es efectivo, con grandes posibilidades de crecimiento, capacitaciones, y muchos beneficios para sus empleados. Adicionalmente, la oferta consta de un muy buen salario, y bonos por desempeño.
Tambien tenemos busquedas para perfiles tester C# y analistas funcionales.
Si a alguno le interesa, por favor envieme un mail a rrhh@xixtech.com. Tambien les pido por favor le reenvien esta busqueda a sus contactos.
Mil gracias!
Gabriela