[pr] 2 Streamy i CopyFrom

0

Dlaczego CopyFrom nie działa w tym kodzie?
Pewnie coś jest nie tak z trybem otwarcia pierwszego strumienia.

  S := TFileStream.Create('e:\temp.txt', fmCreate or fmOpenRead or fmShareDenyWrite);
  try
    // Tutaj zapisuję cos do S
    {..}
    // tworzę nowy strumien
    S2 := TFileStream.Create('E:\temp2.txt', fmCreate or fmShareDenyRead);
    try
      // zapisuje rekord do S2 
      New(FHeader);
      FHeader^.Size := S.Size - Stop;
      FHeader^.Kind := MainFrm.getDiskType(ExtractFileDrive(edtPath.Text));
      S2.Write(FHeader^, SizeOf(FHeader^));
      Dispose(FHeader);
      // kiedy chce skopiowac z S wywala EStreamReadError :(
      S2.CopyFrom(S, S.Size);
    finally
      S2.Free;
    end;
  finally
    S.Free;
  end;

Z góry dziękuję za wszystkie odpowiedzi.

0

S := TFileStream.Create('e:\temp.txt', fmCreate or fmOpenRead or fmShareDenyWrite);
try
// Tutaj zapisuję cos do S
{..}
// tworzę nowy strumien
S2 := TFileStream.Create('E:\temp2.txt', fmCreate or fmShareDenyRead);
try
// zapisuje rekord do S2
New(FHeader);
FHeader^.Size := S.Size - Stop;
FHeader^.Kind := MainFrm.getDiskType(ExtractFileDrive(edtPath.Text));
S2.write(FHeader, SizeOf(FHeader));
Dispose(FHeader);
// kiedy chce skopiowac z S wywala EStreamReadError :(
S2.CopyFrom(S, S.Size);
finally
S2.Free;
end;
finally
S.Free;
end;

Witaj! Popatrz na pierwszą linię:
S := TFileStream.Create('e:\temp.txt', fmCreate or fmOpenRead or fmShareDenyWrite);
(nigdy nie spotkałem się ze strumieniem, który jest otwierany z fmCreate i coś jeszcze :P, prawdę mówiąc, po co??). Dalej chcesz dopisywać do tego strumienia. Wychodzą Ci błędy. Czemu? Patrz, parametry, przy tworzeniu masz fmOpenRead... . Najlepiej, jeżeli tworzysz jakiś plik to korzystaj tylko z fmCreate, po co reszta?? :P

0

Po pierwsze, fmOpenRead- czy to nie jest otwarcie tylko do odczytu? A piszesz, że dalej coś do niego zapisujesz. Może i udało i się.
Po drugie, jak już zapisujesz, to może powróciłbyś na początek pliku, metoda: tfilestram.seek(), wtedy prawdopodobnie tfilestram.copyfrom nie wyszłoby poza obszar pliku i może nie dostałbys komunikatu tego błędu.

0

Kombinowalem juz chyba ze wszystkimi parametrami :(

Ale wystarczyło S.Position := 0

Dzięki [browar]

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