Otwieranie pliku bez blokowania

0

Witam

Korzystam z tego : http://www.lukas-home-page.ovh.org/artykuly/delphi-strumienie-tfilestream.php

Pliki ktore przerabiam na strumienie wybieram przy pomocy OpenDialog1. I sa to pliki dwg, które zapisuje do bazy SQLIte.
Problem się pojawia kiedy przy jednej sesji programu chce wybrac i przerobic na strumień 2x ten sam plik. Gdy wwybieram kilka plikow wszystkei sa zablokowane i nie można ich juz wybrać ponownie.

Czemu tak sie dzieje? czy musze jakoś pamięć zwolnić, sam juz nie wiem.
Proszę o pomoc.

1

Po użyciu zwolnij strumień.
Jeżeli dwa strumienie mogą pisać do tego samego pliku to w konstruktorze strumienia powinieneś przekazać fmShareDenyNone - ale raczej nie polecam tego podejścia.

1

W Delphi jest z tym bug. Może to zrobili specjalnie. Kiedy robisz fmCreate to nie da rady nie blokować.
Rozwiązania:

  1. Poprawić bug w RTL
  2. Przejść na Lazarus'a
  3. Otworzyć z fmCreate, zamknąć, otworzyć ponownie z fmOpenWrite or fmShareDenyNone
0
Fs := TFileStream.Create(ExtractFilePath(Application.ExeName) + 'Rys/nnn.dwg', fmCreate );
Fs.Free;
Fs := TFileStream.Create(ExtractFilePath(Application.ExeName) + 'Rys/nnn.dwg', fmOpenWrite or fmShareDenyNone  );

Czyli o takie coś chodzi? Z fmShareDenyNone troche program zmulił :D

0

Wpadłem na pomysł zeby zrobić coś takiego.
Otwieram FileStream rysunku (fmopenRead) następnie kopiuje streama do MemoryStream lub StringStream i zwalniam pamiec FileStream'a.

Kopiuje tak: FileS.Read(Buff,Files.Size); lub StringStream.CopyFrom(FileS, FileS.Size);

Problem w tym że tak zapisanego pliku nie sposób odtworzyc bo jest błędnie zapisany :(
Jak kopiować streamy aby nie uszkadzać pliku?

1

Przed chwilą zrobiłem na szybko kopiowanie z TFileStream do TMemoryStream i oba pliki mam takie same, więc może problem jest ze TStringStreamam. Przykładowy kod:

//...
var
  FS : TFileStream;
  mS : TMemoryStream;
begin
  FS := TFileStream.Create('D:\1', fmOpenRead);
  mS := TMemoryStream.Create;
  MS.CopyFrom(FS, FS.Size);
  FS.Free;
  MS.SaveToFile('D:\2');
  MS.Free;
end;
//...
2

Nie używać StringStream do przechowania danych binarnych, bo to jednoznaczne z problemami.

0

Tak, teraz jest ok.

Problemem było to ze chciałem zapisać streama i poznej dodac do SQLite plik o wielkości 0 bajtów i wyskakiwał mi komunikat
'Error getting memory to save blob'

Poszukałem i naprowadziło mnie "nil" :)

   
//dodawanie bloba w SQLITE
       GetMem(DataPtr, DataSize);
          if (DataPtr = nil) then
            raise ESqliteException.Create('Error getting memory to save blob');

Dzieki wszystkim za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1