Witam,
Mam dość prostę pytanie lecz nie wiem jak to zrobić nie odczytując całego pliku. :d
Chodzi mi o dopisywaniu do pliku informacji linijka po linijce nie odczytując całego pliku.
Robię coś takiego: :>
Daje TFileStream
i otwieram plik do zapisu
i zapisuje WriteBuffor i ustawiam Position na Size tego pliku czyli na koniec.
Jednak to jest zły pomysł ;-(
A zwykłe dopisywanie do pliku jako zmiennej typu file przez Writeln nie może być ??
Ale dlaczego ten filestream to zły pomysł? Przecież filestream nie wczytuje calego piku do pamięci (tak mi się wydaje, ale inaczej to by była porażka :) ), tylko wskaźnik do niego, więc powinno to się wykonywać szybko nawet dla dużych plików.
Robię tak:
procedure Dopisz(Co: String);
var
f: TFileStream;
begin
f := TFileStream.Create('plik.txt', fmOpenWrite or fmShareDenyWrite);
f.Seek(f.Size,soFormBeginning)
f.Write(Co,Length(Co);
//lub WriteBuffer(Co,Length(Co);
f.Free;
end;
I wyskakują mi w pliku jakieś głupoty [???]
Coś nie tak zrobiłem sprawa wygląda za prosto :-/
Teraz wykombinowałem coś takiego:
procedure Dopisz(Co: string);
begin
if not FileExists('plikczek.txt') then FileCreate('plikczek.txt');
with TFileStream.Create('plikczek.txt', fmOpenWrite or fmShareExclusive) do
begin
try
if Size > 0 then
Seek(0, soFromEnd);
Write(Pchar(Co)^, Length(Co));
finally
Free;
end;
end;
end;
I teraz jest mały problem, gdy pliku nie ma lub jest pusty nie można go otworzyć. :-8
Dodałem już na początku obsługę tworzenia pliku, ale i tak muszę jeszcze coś zrobić z tym plikiem bo wywala błąd.
fmCreate - Create a file with the given name. If a file with the given name exists, open the file in write mode.
I mozesz wywalić całego if-a.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.