Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Negatives TFileStream.Seek mit soFromEnd unter Windows 98 (https://www.delphipraxis.net/99913-negatives-tfilestream-seek-mit-sofromend-unter-windows-98-a.html)

karlkoch 19. Sep 2007 14:01


Negatives TFileStream.Seek mit soFromEnd unter Windows 98
 
Hallo,

ich stehe hier vor einem kleinen Rätsel. Ich öffne eine Datei über TFileStream und springe kurz vors Ende mit
Delphi-Quellcode:
Stream.Seek(-22, soFromEnd);
Das funktioniert soweit, nur habe ich mein Programm nun mit Virtual PC mit Windows 98 getestet und dort spingt der Stream auf einmal vorwärts. Drehe ich das Vorzeichen um, so dreht sich auch die Richtung. Ist das nun ein Problem von Windows 98, von meinem Programm oder von Virtual PC?

karlkoch

shmia 19. Sep 2007 18:10

Re: Negatives TFileStream.Seek mit soFromEnd unter Windows 9
 
Welche Delphi Version verwendest du ?
Bitte gleich auch in deinem User-Profil von Delphi-Praxis eintragen.
Ab Delphi Version 6 unterstützt die TStream-Klasse auch Streams grösser als 2 GB,
da nun das Property Position von Integer nach Int64 geändert wurde.

Wie stellst du fest, dass du dich im Stream vorwärts bewegst ?
Wahrscheinlich hast du dich nur selbst ausgetrickst.

karlkoch 19. Sep 2007 23:38

Re: Negatives TFileStream.Seek mit soFromEnd unter Windows 9
 
Ich verwende Turbo Delphi und das Problem tritt bei jeder Datei auf, egal wie groß. Ich vermute mal das es da ein Problem mit VirtualPC gibt, würde mir das aber gern bestätigen lassen. Wie gesagt ein Aufruf von Stream.Seek(-22, soFromEnd) bringt unter Win98 in VirtualPC 2007 eine Vorwärtsbewegung, ermittelt mit Pos := Stream.Position.

karlkoch

shmia 20. Sep 2007 10:20

Re: Negatives TFileStream.Seek mit soFromEnd unter Windows 9
 
Wenn's dich wirklich interessiert, dann könntest du hier ja den Sourcecode für ein kleines Testprogramm liefern.
Das Testprogramm gibt die Aussage "funktioniert" oder "funktioniert nicht".
Ich könnte dir sagen, ob das Testprogramm prinzipiell korrekt ist und die Mitleser
könnten es auch ihren System testen.

SirThornberry 20. Sep 2007 10:57

Re: Negatives TFileStream.Seek mit soFromEnd unter Windows 9
 
ich glaub kaum das es an virtual pc liegt, eher an win98. Ansonsten würde ja fast nichts laufen wenn vorzeichen in allen möglichen programmen einfach umgekehrt werden. dann würde wohl auch das bs selbst nicht richtig laufen. Ich tippe eher darauf das die verwendeten Api-Funktionen die Konstante damals noch nicht kannten oder eine andere bedeutung hatten.

karlkoch 20. Sep 2007 11:09

Re: Negatives TFileStream.Seek mit soFromEnd unter Windows 9
 
Ich kann den Fehler mit folgendem Beispielcode reproduzieren:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create('Test.txt', fmOpenRead or fmShareDenyWrite);
  try
    Stream.Seek(-1, soFromEnd);
    ShowMessage(Format('Größe: %d Position: %d', [Stream.Size, Stream.Position]));
  finally
    Stream.Free;
  end;
end;
Wie zu erwarten gibt das Programm eine Position eins vor der Gesamtgröße zurück, was auch völlig normal ist. In VirtualPC mit Win98 springt er jedoch 1 hinter die Datei. Zum Testen einfach die 'Test.txt' mit einer eigenen Datei ersetzen, die mindestens 1 Byte groß ist.

karlkoch

marabu 20. Sep 2007 12:35

Re: Negatives TFileStream.Seek mit soFromEnd unter Windows 9
 
Hallo,

ich hoffe doch sehr, dass du WIN98SE verwendet hast. Um den Bug zu umgehen könntest du die Positionierung anders durchführen:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create('Test.txt', fmOpenRead or fmShareDenyWrite);
  try
    Stream.Position := Stream.Size - 1;
    ShowMessage(Format('Größe: %d Position: %d', [Stream.Size, Stream.Position]));
  finally
    Stream.Free;
  end;
end;
Grüße vom marabu

SirThornberry 20. Sep 2007 12:49

Re: Negatives TFileStream.Seek mit soFromEnd unter Windows 9
 
folgendes steht im msdn zu SetFilePointer (was intern durch seek aufgerufen wird)
Zitat:

You can use SetFilePointer to determine the length of a file. To do this, use FILE_END for dwMoveMethod and seek to location zero (0). The file offset returned is the length of the file. However, this practice can have unintended side effects, for example, failure to save the current file pointer so that the program can return to that location. It is best to use GetFileSize instead.

marabu 20. Sep 2007 12:56

Re: Negatives TFileStream.Seek mit soFromEnd unter Windows 9
 
Hallo Jens,

die VCL-Macher wussten das und repositionieren den Stream.

Freundliche Grüße

karlkoch 20. Sep 2007 15:11

Re: Negatives TFileStream.Seek mit soFromEnd unter Windows 9
 
Ich verwende die erste Version von Win98 in der virtuellen Umgebung. Danke an marabu für einen möglichen Workaround. Aber konnte denn jemand diesen Fehler bestätigen, sodass sich rausfinden lässt obs nun an Win98 oder an VirtualPC liegt?

karlkoch


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz