community.borland.com

Article #15170: Network File Access

 Technical Information Database

TI170D.txt   Network File Access
Category   :General Programming
Platform    :All
Product    :Pascal  All

Description:

FILE AND RECORD LOCKING IN TURBO PASCAL

Turbo Pascal does not have built-in support for file and record
locking.  It does, however, have the ability to open files for
shared access.  This is accomplished by setting the value of the
system variable FileMode.  By default, FileMode has a value of 2
which causes files opened to have single-user, read/write access.
A shared, read/write mode can be had by setting FileMode to a
value of 66. Whereas, a shared, read only mode is represented by
the value 64.

Record and file locking is a bit more difficult.  DOS version 3.0
and later provide record locking through the use of Interrupt
21H, Service 5CH.  This service may be accessed through Turbo
Pascal's procedure MsDos defined in the Dos unit.

Here's a routine designed to lock and unlock portions of any
untyped or type file.  Note, these routines may not be used with
text files.

procedure LockBlock(var F; Offset: Longint; Length: LongInt;
Lock: Boolean);
type
  LoHiRec = record
   LoWord, HiWord: Word;
  end;
var
  RecordSize: Word;
  Handle: Integer;
  File: FileRec absolute F;
  R: Registers;
begin
  Handle := File.Handle;
  RecordSize := File.RecSize;
  Offset := Offset * RecordSize;
  R.CX := LoHiRec(Offset).LoWord;
  R.DX := LoHiRec(Offset).HiWord;
  R.SI := LoHiRec(Length).LoWord;
  R.DI := LoHiRec(Length).HiWord;
  R.AH := $5C;
  if Lock then R.AL := 0 else R.AL := 1;
  MsDos(R);
  if (R.Flags and FCarry) <> 0 then
  begin
    RunError(R.AX);
  end;
end;

The parameter 'offset' indicates what record is to mark the
beginning of the file lock. 'Length' determines how many records
will be locked from this point.  The 'lock' parameter determines
whether the portion of the file is to be locked or unlocked.

To lock an entire file, pass 0 for offset and the results of the
FileSize function for the number of records to be locked.

This routine will function as expected when using SHARE and/or
MS-DOS compatible network software.


Reference:


7/16/98 4:33:38 PM
 

Last Modified: 01-SEP-99