Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Ayuda con variable tipo File (https://www.clubdelphi.com/foros/showthread.php?t=82279)

JerS 18-02-2013 14:28:44

Ayuda con variable tipo File
 
Amigos tengo una duda, con el manejo de variables tipo File

yo tengo almacenado en mi base de datos una plantilla de tipo blob y quiero asignarla a una variable tipo file esto es posible? o me recomiendan utilizar TMemoryStream o TFileStream

ecfisa 18-02-2013 17:08:04

Hola JerS.

Habría que ver el caso con detalle para evaluar la conveniencia de usar archivos sin tipo para realizar la lectura/escritura de los campos blob.

Pero dado que la clase TBlobField posee los métodos LoadFromStream y SaveToStream, creo que sería más sencillo usando un descendiente de TStream.

Saludos.

Neftali [Germán.Estévez] 18-02-2013 17:16:04

¿Qué es una plantilla de tipo blob? Para tí, me refiero. Se supone que blob es cualquier cosa que sea "binaria".
¿Qué es una variable de tipo File (FileHandle)?

Tal vez si nos explicas qué es el blob y qué quieres hacer con él, nos aclare algo más...

JerS 22-02-2013 21:11:04

Amigos ncfisa y neftali
Voy a ser un poco mas claro con ustedes, tengo unas SDK de identificación biometrica pero funciona guardando las huellas o templates en archivos, pero me gustaria manejarlo con Base de Datos, por eso creo conveniente cambiar lla variable File por TMemoryStream o cualquiera que ustedes me recomienden. aqui les dejo un Ejm del codigo :

Código Delphi [-]

var
   fPtr:       file;
   lpRec:      LPDBREC;
   dSize:      DWORD;
   rdTotal:    Integer;

begin
   // get record's data length
   AssignFile( fPtr, fName );
   Reset( fPtr, 1 );
   BlockRead( fPtr, dSize, sizeof( DWORD ), rdTotal );
   if rdTotal <> sizeof( DWORD ) then
   begin
      CloseFile( fPtr );
      GetRecord := nil;
      Exit;
   end;

   // allocate memory for record
   lpRec := AllocRecordMem( dSize );

   // read key information
   BlockRead( fPtr, lpRec.key, sizeof( FTR_DATA_KEY ), rdTotal );
   if rdTotal <> sizeof( FTR_DATA_KEY ) then
   begin
      CloseFile( fPtr );
      FreeRecordMem( lpRec );
      GetRecord := nil;
      Exit;
   end;

   // read biometric data
   BlockRead( fPtr, PChar( lpRec.data )^, dSize, rdTotal );
   if DWORD( rdTotal ) <> dSize then
   begin
      CloseFile( fPtr );
      FreeRecordMem( lpRec );
      GetRecord := nil;
      Exit;
   end;

   // success
   CloseFile( fPtr );
   GetRecord := lpRec;
end;

Ñuño Martínez 25-02-2013 12:08:04

Por lo que sé, a una variable tipo FILE sólo se le pueden asignar archivos. Estos no tienen por qué ser archivos físicos en disco, ya que también pueden asignársele archivos virtuales como "crt:" o "lpt1:", por poner dos ejemplos. En definitiva, si el sistema operativo permite acceder a "algo" vía archivo, entonces puedes "asignarlo" a una variable tipo FILE. Algunos sistemas operativos permiten acceder a la memoria mediante archivos virtuales, y dado que un "blob" se puede almacenar en memoria, es posible que puedas hacerlo; pero hasta aquí puedo leer ya que no tengo ni idea de cómo se hace. Quizá buscando en la MSDN encuentres algo.

JerS 25-02-2013 15:31:40

Cita:

Empezado por Ñuño Martínez (Mensaje 455522)
Por lo que sé, a una variable tipo FILE sólo se le pueden asignar archivos. Estos no tienen por qué ser archivos físicos en disco, ya que también pueden asignársele archivos virtuales como "crt:" o "lpt1:", por poner dos ejemplos. En definitiva, si el sistema operativo permite acceder a "algo" vía archivo, entonces puedes "asignarlo" a una variable tipo FILE. Algunos sistemas operativos permiten acceder a la memoria mediante archivos virtuales, y dado que un "blob" se puede almacenar en memoria, es posible que puedas hacerlo; pero hasta aquí puedo leer ya que no tengo ni idea de cómo se hace. Quizá buscando en la MSDN encuentres algo.

Pero si hay forma de sustituir el File por un tipo de dato TMemoryStream asignándole el valor desde un Blob

ecfisa 25-02-2013 18:12:32

Hola Jers.

Ahora estoy un poco confundido sobre que es lo que buscas hacer. Pero fijate si de este hilo podés sacar alguna idea.

Saludos.

JerS 25-02-2013 18:32:06

Cita:

Empezado por ecfisa (Mensaje 455552)
Hola Jers.

Ahora estoy un poco confundido sobre que es lo que buscas hacer. Pero fijate si de este hilo podés sacar alguna idea.

Saludos.

Lo que intento hacer es cambiar el codigo que publique , el cual utiliza una variable tipo file, ya que usa un archivo , por un codigo que en vez de usar un archivo traiga la información de un campo blob y pueda manipularla tal cual manipula el archivo

ecfisa 25-02-2013 21:38:42

Cita:

Empezado por JerS (Mensaje 455555)
por un codigo que en vez de usar un archivo traiga la información de un campo blob y pueda manipularla tal cual manipula el archivo

Hola JerS.

La función BlobToRecord del enlace que te pasé, pasa el contenido de un TBlobField a una variable de tipo record (supongo que LPDBREC es un tipo apuntador a record). Claro que tendrás que modificar algunas cosas como el tipo del parámetro, pero si entendí bien tendría que funcionar.

Lo que realmente me confunde es que quieras asignar una variable tipo BLOB a una tipo FILE, ya que aún superando las dificultades que te comenta Ñuño, no veo que funcionalidad podría tener. Es decir ¿ Deseas pasar la variable BLOB como handle de un tipo FILE ?

Saludos.

nlsgarcia 26-02-2013 01:59:45

JerS,

Cita:

Empezado por JerS
...tengo almacenado en mi base de datos una plantilla de tipo blob y quiero asignarla a una variable tipo file esto es posible?...

Entiendo que en tu BD tienes un campo Blob y quieres almacenar en este un archivo binario.

Cita:

Empezado por JerS
...tengo unas SDK de identificación biometrica pero funciona guardando las huellas o templates en archivos, pero me gustaria manejarlo con Base de Datos...

Corolario de lo anterior.

Revisa estos links:
Cita:

Working With BLOBs Using Delphi:
http://www.onlinedelphitraining.com/...ters/blobs.htm

How save a file in BLOB and use later:
http://www.scalabium.com/faq/dct0141.htm
Espero sea útil :)

Nelson.

JerS 07-03-2013 00:16:47

Amigos en mi ignorancia a la hora de manejar archivos queria saber que se hace exactamente en esta función:
Código Delphi [-]
 BlockRead( fPtr, PChar( lpRec.data )^, dSize, rdTotal );
   if DWORD( rdTotal ) <> dSize then
   begin
      CloseFile( fPtr );
      FreeRecordMem( lpRec );
      GetRecord := nil;
      Exit;
   end;
para hacer lo mismo pero con mi variable TMemory

ecfisa 07-03-2013 15:39:20

Cita:

Empezado por JerS (Mensaje 456140)
Amigos en mi ignorancia a la hora de manejar archivos queria saber que se hace exactamente en esta función:
...

Hola JerS.

Me parece que la explicación es mas clara comentando el código:
Código Delphi [-]
 { BlockRead lee uno o mas registros lógicaos a partir de la
   posición actual del archivo y los almacena en una variable }
   BlockRead(fPtr,               // file
             PChar(lpRec.data)^, // variable
             dSize,              // nro de registros
             rdTotal);           // registros leidos

   { Si el número de registros leidos difiere de los solicitados ...}
   if DWORD(rdTotal) <> dSize then
   begin
      CloseFile(fPtr);           // cerrar file
      FreeRecordMem(lpRec);      // ?? (supongo libera puntero a record)
      GetRecord := nil;          // pone a nulo el puntero GetRecord
      Exit;                      // sale del procedimiento/funcion
   end;

Saludos.


La franja horaria es GMT +2. Ahora son las 22:30:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi