Einzelnen Beitrag anzeigen

Lothar

Registriert seit: 26. Apr 2007
Ort: München
12 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Filestream.Lock: Rätselhaftes Verhalten

  Alt 30. Apr 2007, 21:59
Hallo!

Danke für die Nachfragen!
Es ist ganz einfach: Ich teste gerade eine Portierung einer Win32-Anwendung. In Win32 gibt es "file of (record)". Da ist es ganz simpel: Wie Du sagst wird recordweise gelocked. Bei .NET gibt es aber kein "file of (record)" mehr, sondern nur noch Filestreams. D.h. auf die Datei wird byteweise sukzessive zugegriffen. Mit 'seek' oder 'position' setzt man an der Stelle, wo der Record ist, auf und liest dann den entsprechenden Bereich. Man muß also den Start ausrechnen und die Länge des Records lesen - bzw. hier: locken.

Selbstverständlich soll aber nur der Bereich des Record gelocked werden und nichts sonst. Der wird hier auch sauber gesperrt, aber was dann passiert, ist, daß ein darunter/davorliegender Bereich von ca. 4 K nicht mehr lesbar ist (es kommt die besagte Exception). Das ist natürlich indiskutabel.

Ich habe mir in den letzten Tagen alle im Web auffindbaren Beispiele von Filestream.Lock angeschaut. Da steht es auch entsprechend. Aber von dem Lesefehler steht nirgends etwas erwähnt.

Ich benutze übrigens mit Win32 auch schon seit längerem TFilestream. Da geht das Locking über

LockFile(hZei,Recordnumber * sizeof(NSatz),0,sizeof(NSatz),0);
[wobei hZei:=FileOpen(N_Name,fmReadWr+fmDenyNone);]


also im Grunde analog, mur mit Datei-Handle. Und das Lesen geht mit

FileSeek(hZei,Recordnumber * sizeof(NSatz),0); und
FileRead(hZei,NSatz,SizeOf(NSatz));


Der riesige Vorteil ist hier, daß ich mit einem Befehl den ganzen Record auslesen kann, mit der ganzen heterogenen Datenstruktur. In .NET muß ich aber byte- und char-weise hintereinander auslesen. Aber das nur nebenbei...

Gruß
Lothar
  Mit Zitat antworten Zitat