Cześć,
chciałbym Was prosić o pomoc w rozwiązaniu pewnego problemu. Zaczynając od początku idea jest następująca:
- dobieram się do pliku txt, który jest zablokowany, więc ładuje jego zawartość do TFileStream
- szukając interesujących mnie informacji w dalszym kodzie do TStringList ładuje zawartość FileStream
- gdy aplikacja generuje wyjątek out of memory próbuję załadować mniejszy fragment streamu
Kod przedstawia się następująco:
LinesList := TStringList.Create;
FileStream := nil;
FileStream := TFileStream.Create(nazwaPliku,fmOpenRead or fmShareDenyNone);
FileStream.Seek(0,soFromBeginning);
//LinesList.LoadFromStream(FileStream);
try
try
LinesList.LoadFromStream(FileStream); // <----- tutaj się wywalał kiedyś błąd
except
{ tutaj go obsłużyłem i dłuższy czas było ok, ale znów się coś popsuło }
if FileExists('temp.log') then
DeleteFile('temp.log');
rozmiarStream := FileStream.Size div 4;
FileStream.Seek(rozmiarStream*3, soBeginning);
FileStream.Seek(0, soBeginning);
MemoryStream := TMemoryStream.Create;
MemoryStream.CopyFrom(FileStream, rozmiarStream);
MemoryStream.SaveToFile('temp.log');
LinesList.LoadFromFile('temp.log');
ostatnioPrzeczytanaLinia := 0;
end;
except
on e:exception do
FormMain.ObsluzBlad(e,'procedura:odczytpliku','');
end;
W przypadku pliku wczytanego do TFileStream > ok 5MB generuje się wyjątek:
Out of memory while expanding memory stream
Kod jest trochę zamieszany, ale niegdyś wyjątki często generowały się w drugim TRY, dlatego obsłużyłem go i postanowiłem w EXCEPT dopisać trochę kodu. Ostatnio nawet tam zaczynają się generować. Widzicie jakąś możliwość na uproszczenie tego, albo zastosowanie bardziej profesjonalnej metody? :)