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