Newsgroup: it.comp.lang.delphi
Titolo: Blob in un db file modificato

Se in un database ho un blob con un file,lo salvo 
temporaneamente, lo apro con delphi  e praticamente vorrei 
reimmetterlo nel blob se e solo se e' stato modificato. come 
faccio a sapere se e' stato modificato...
con shellExecuteEx so quando viene chiuso ma non se e' stato 
modificato o meno.
Lo rimetto nel blob tutte le volte?
Vorrei fare come filezilla che si accorge che e' stato 
modificato e chiede se voglio riuppare il file sul server.
ciau

calcola un hash
A.

temporaneamente
Il modo più efficiente e semplice (vista la disponibilità di librerie)
per confrontare due file, è quello di calcolare un hash (md5 o sha1,
per esempio). Se gli hash sono distinti, allora i contenuti sono
diversi. In ogni caso, perché vuoi salvare il contenuto di un blob su
un file ? L'esistenza dei campi blob serve proprio a impedire questo
tipo di elaborazioni "esterne"...
 

 tipo di elaborazioni "esterne"...
non ho mai usato i blob per i file e non so aprirlo al volo!
Come faccio ad aprirlo al volo senza salvarlo su disco 
dovrei caricarlo in memoria ed aprirlo?
sto facendo delle prove e questo e' il codice :(non guardate 
result:=true che e' tutto un test fatto velocemente...):
function TForm1.ReadFileFromBlob: Boolean;
begin
   SaveFileFromBlob();
   OpenFileFromDb();
   Result:=True;
end;
function TForm1.OpenFileFromDb: Boolean;
var
   myHANDLE: TShellExecuteInfo;
begin
   try
     FillChar(myHANDLE, SizeOf(myHANDLE), 0);
     myHANDLE.cbSize := SizeOf(myHANDLE);
     myHANDLE.fMask := SEE_MASK_NOCLOSEPROCESS;
     myHANDLE.Wnd := Handle;
     myHANDLE.lpVerb := 'open';
     myHANDLE.lpFile 
:=PChar(ExtractFilePath(Application.ExeName)+'tmp\tmp000.txt'); 
        // CHANGE ME!!!
     myHANDLE.lpParameters := nil;
     myHANDLE.lpDirectory := nil;
     myHANDLE.nShow := SW_SHOW;
   if (ShellExecuteEx(@myHANDLE)) then
   begin
     WaitForSingleObject(myHANDLE.hProcess, INFINITE);
     MessageBox(Handle, 'Hai Chiuso il File/Applicazione che 
hai lanciato!!!', 'Finished!',MB_OK);
     CloseHandle(myHANDLE.hProcess);
   end;
   finally
     Result:=True;
   end;
end;
function TForm1.SaveFileFromBlob: Boolean;
var
   FileStream : TMemoryStream ;
begin
   FileStream := TMemoryStream.Create ;
 
TBlobField(ClientDataSet1.FieldByName('FLS_REPORT')).SaveToStream(FileStream);
 
FileStream.SaveToFile(ExtractFilePath(Application.ExeName)+'tmp\tmp000.txt');
   FileStream.Free ;
   Result:=True;
end;

 dovrei caricarlo in memoria ed aprirlo?
Il contenuto del BLOB è leggibile in uno stream.  Da lì ci fai tutto
quello che vuoi, senza salvare nulla (anche perché la cosa comporterebbe
conflitti in multiutenza).
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

> dovrei caricarlo in memoria ed aprirlo?
Incuriosito dal thread, ho cercato la soluzione venitlata da andrea: ecco
un link esplicativo, fa uso di TOleContainer:
http://tinyurl.com/2hcb5y
oppure
http://groups.google.it/group/borland.public.delphi.oleautomation/browse_thread/thread/2abeb345810268bf/a7b1455334a25827%23a7b1455334a25827
Ciao
-- 
Morde

 un link esplicativo, fa uso di TOleContainer:
Non serve un OLE container, il contenuto di un blob è leggibile in un
memory stream qualsiasi...


 Non serve un OLE container, il contenuto di un blob è leggibile in un
ok cerchero' di fare come consigli in quanto anchio penso 
sia la soluzione piu' logica. Tuttavia dovro' vedere come 
aprire un memortstream!
Ciao & grazie a tutti!

 aprire un memortstream!
gia sai.
A.