This commit is contained in:
mysticbbs 2013-05-09 02:12:32 -04:00
parent cee65a7621
commit fe7efba2c4
2 changed files with 211 additions and 325 deletions

View File

@ -1,16 +1,7 @@
{ Unit m_FileIO;
Mystic Software Development Library
===========================================================================
File | M_FILEIO.PAS
Desc | File IO related functions
Created | August 22, 2002
---------------------------------------------------------------------------
}
{$I M_OPS.PAS} {$I M_OPS.PAS}
Unit m_FileIO;
Interface Interface
{ FILE ACCESS FUNCTIONS } { FILE ACCESS FUNCTIONS }
@ -63,53 +54,48 @@ Const
fmRWDR = 50; fmRWDR = 50;
fmRWDW = 34; fmRWDW = 34;
{ BUFFERED FILE IO CLASS DEFINITION } { STREAMING CLASS OPTIONS }
Const Const
TMaxBufferSize = 64 * 1024 - 1; // Maximum of 64KB buffer for IO class MaxFileBufferSize = 64 * 1024;
Type Type
TBufFileOpenType = ( TFileBufferOpenType = (
fmOpen, fmOpen,
fmOpenCreate, fmOpenCreate,
fmCreate fmCreate
); );
PBufFileBuffer = ^TBufFileBuffer; PFileBufferRec = ^TFileBufferRec;
TBufFileBuffer = Array[0..TMaxBufferSize] of Byte; TFileBufferRec = Array[0..MaxFileBufferSize - 1] of Char;
TBufFile = Class TFileBuffer = Class
Private BufSize : LongInt;
BufFile : File; Buffer : PFileBufferRec;
Buffer : PBufFileBuffer; BufRead : LongInt;
Opened : Boolean; BufStart : LongInt;
BufDirty : Boolean; BufEnd : LongInt;
BufFilePos : Longint; BufPos : LongInt;
RecordSize : LongInt; InFile : File;
BufSize : LongInt; BufEOF : Boolean;
BufPos : LongInt; BufDirty : Boolean;
BufTop : LongInt; IsOpened : Boolean;
Procedure FillBuffer; Constructor Create (BufferSize: LongInt);
Procedure FlushBuffer;
Public
IOResult : Integer;
Constructor Create (BS: Word);
Destructor Destroy; Override; Destructor Destroy; Override;
Function Open (FN: String; OM: TBufFileOpenType; FM: Byte; RS: Word) : Boolean;
Procedure Close; Function OpenStream (FN: String; OpenType: TFileBufferOpenType; OpenMode: Byte) : Boolean;
Procedure Reset; Procedure CloseStream;
Function EOF : Boolean; Function Read : Char;
Procedure BlockRead (Var Buf; Size: LongInt; Var Count: LongInt); Overload;
Procedure BlockRead (Var Buf; Size: LongInt); Overload;
Procedure BlockWrite (Var Buf; Size: LongInt);
Procedure Seek (FP : LongInt);
Function FilePos : LongInt; Function FilePos : LongInt;
Function FileSize : LongInt; Function FileSize : LongInt;
Procedure Seek (Pos : LongInt); Function EOF : Boolean;
Procedure Read (Var V); Procedure FillBuffer;
Procedure Write (Var V); Procedure FlushBuffer;
Procedure BlockRead (Var V; Count: LongInt; Var Result: LongInt);
Procedure BlockWrite (Var V; Count: LongInt; Var Result: LongInt);
Procedure RecordInsert (RecNum: LongInt);
Procedure RecordDelete (RecNum: LongInt);
End; End;
Implementation Implementation
@ -502,287 +488,6 @@ Begin
Result := ((Attr And Directory) = Directory); Result := ((Attr And Directory) = Directory);
End; End;
{ BEGIN BUFFERED FILE IO CLASS HERE ======================================= }
Constructor TBufFile.Create (BS: Word);
Begin
Inherited Create;
Opened := False;
BufDirty := False;
BufFilePos := 0;
RecordSize := 0;
BufSize := BS;
BufPos := 0;
BufTop := 0;
If BufSize > TMaxBufferSize + 1 Then Fail;
GetMem (Buffer, BufSize);
If Buffer = Nil Then Fail;
End;
Destructor TBufFile.Destroy;
Begin
If Opened Then Close;
If Buffer <> Nil Then FreeMem (Buffer, BufSize);
Inherited Destroy;
End;
Function TBufFile.Open (FN: String; OM: TBufFileOpenType; FM: Byte; RS: Word) : Boolean;
Begin
If Opened Then Close;
Result := False;
RecordSize := RS;
BufFilePos := 0;
BufPos := 0;
BufTop := 0;
System.Assign (BufFile, FN);
If System.IoResult <> 0 Then Exit;
System.FileMode := FM;
Case OM of
fmOpen : Begin
{$I-} System.Reset(BufFile, 1); {$I+}
If System.IoResult <> 0 Then Exit;
FillBuffer;
End;
fmOpenCreate: Begin
{$I-} System.Reset(BufFile, 1); {$I+}
If System.IoResult <> 0 Then Begin
{$I-} System.ReWrite(BufFile, 1); {$I+}
If System.IoResult <> 0 Then Exit;
End Else
FillBuffer;
End;
fmCreate : Begin
{$I-} System.ReWrite(BufFile, 1); {$I+}
If IoResult <> 0 Then Exit;
End;
End;
Result := True;
Opened := True;
End;
Procedure TBufFile.Close;
Begin
If BufDirty Then FlushBuffer;
System.Close(BufFile);
IOResult := System.IoResult;
Opened := False;
End;
Function TBufFile.EOF : Boolean;
Begin
Result := FilePos >= FileSize;
End;
Function TBufFile.FileSize : Longint;
Begin
Result := System.FileSize(BufFile) DIV RecordSize;
End;
Function TBufFile.FilePos : Longint;
Begin
Result := (BufFilePos + BufPos) DIV RecordSize;
End;
Procedure TBufFile.Reset;
Begin
If BufDirty Then FlushBuffer;
System.Seek(BufFile, 0);
BufFilePos := 0;
BufPos := 0;
FillBuffer;
End;
Procedure TBufFile.Seek (Pos: Longint);
Begin
Pos := Pos * RecordSize;
If (Pos >= BufFilePos + BufSize) or (Pos < BufFilePos) Then Begin
If BufDirty Then FlushBuffer;
System.Seek(BufFile, Pos);
BufFilePos := Pos;
BufPos := 0;
FillBuffer;
End Else
BufPos := Pos - BufFilePos;
IoResult := System.IoResult;
End;
Procedure TBufFile.Read (Var V);
Var
Offset : Word;
Begin
If BufPos + RecordSize > BufTop Then Begin
Offset := BufSize - BufPos;
Move(Buffer^[BufPos], V, Offset);
Inc(BufFilePos, BufSize);
BufPos:= 0;
FillBuffer;
Move(Buffer^[BufPos], TBufFileBuffer(V)[Offset], RecordSize - Offset);
BufPos:= BufPos + RecordSize - Offset;
End Else Begin
Move(Buffer^[BufPos], V, RecordSize);
Inc(BufPos, RecordSize);
End;
IoResult := System.IoResult;
End;
Procedure TBufFile.BlockRead (Var V; Count: LongInt; Var Result: LongInt);
Begin
Result := 0;
While (Result < Count) and (IoResult = 0) And Not EOF Do Begin
Read (TBufFileBuffer(V)[Result * RecordSize]);
Inc (Result);
End;
End;
Procedure TBufFile.Write (Var V);
Var
Offset : Word;
Begin
BufDirty := True;
If BufPos + RecordSize > BufSize Then Begin
Offset := BufSize - BufPos;
If Offset > 0 Then
Move(V, Buffer^[BufPos], Offset);
BufTop := BufSize;
FlushBuffer;
Inc(BufFilePos, BufSize);
BufPos:= 0;
FillBuffer;
Move (TBufFileBuffer(V)[Offset], Buffer^[BufPos], RecordSize - Offset);
BufPos := BufPos + RecordSize - Offset;
End Else Begin
Move (V, Buffer^[BufPos], RecordSize);
Inc (BufPos, RecordSize);
End;
If BufTop < BufPos Then BufTop := BufPos;
IoResult := System.IoResult;
End;
Procedure TBufFile.BlockWrite (Var V; Count: LongInt; Var Result: LongInt);
Begin
Result := 0;
While (Result < Count) And (IoResult = 0) Do Begin
Write (TBufFileBuffer(V)[Result * RecordSize]);
Inc (Result);
End;
End;
Procedure TBufFile.FillBuffer;
Begin
System.Seek (BufFile, BufFilePos);
System.BlockRead (BufFile, Buffer^, BufSize, BufTop);
IoResult := System.IoResult;
If IoResult = 0 Then BufDirty := False;
End;
Procedure TBufFile.FlushBuffer;
Begin
System.Seek (BufFile, BufFilePos);
System.BlockWrite (BufFile, Buffer^, BufTop, BufTop);
IoResult := System.IoResult;
// BufPos := 0;
End;
Procedure TBufFile.RecordInsert (RecNum: LongInt);
Var
TempBuf : PBufFileBuffer;
Count : LongInt;
Begin
If (RecNum < 1) or (RecNum > FileSize + 1) Then Exit;
GetMem (TempBuf, RecordSize);
Dec (RecNum);
Reset;
For Count := FileSize - 1 DownTo RecNum Do Begin
System.Seek (BufFile, Count * RecordSize);
System.BlockRead (BufFile, TempBuf^, RecordSize);
System.BlockWrite (BufFile, TempBuf^, RecordSize);
End;
Seek (RecNum);
FillBuffer;
FreeMem (TempBuf, RecordSize);
End;
Procedure TBufFile.RecordDelete (RecNum: LongInt);
Var
TempBuf : PBufFileBuffer;
Count : LongInt;
Begin
If (RecNum < 1) or (RecNum > FileSize) Then Exit;
GetMem (TempBuf, RecordSize);
Dec (RecNum);
Reset;
For Count := RecNum To FileSize - 2 Do Begin
System.Seek (BufFile, Succ(Count) * RecordSize);
System.BlockRead (BufFile, TempBuf^, RecordSize);
System.Seek (BufFile, Count * RecordSize);
System.BlockWrite (BufFile, TempBuf^, RecordSize);
End;
System.Seek (BufFile, Pred(FileSize) * RecordSize);
System.Truncate (BufFile);
Seek (RecNum);
FillBuffer;
FreeMem (TempBuf, RecordSize);
End;
Function FileFind (FN: String) : String; Function FileFind (FN: String) : String;
Var Var
Dir : SearchRec; Dir : SearchRec;
@ -847,4 +552,185 @@ Begin
Result := FN + '.' + NewExt; Result := FN + '.' + NewExt;
End; End;
{ FILE STREAMING FUNCTIONS }
Constructor TFileBuffer.Create (BufferSize: LongInt);
Begin
Inherited Create;
BufSize := BufferSize;
BufStart := 0;
BufEnd := 0;
BufPos := 0;
BufEOF := False;
BufRead := 0;
Buffer := NIL;
BufDirty := False;
IsOpened := False;
End;
Destructor TFileBuffer.Destroy;
Begin
If IsOpened Then CloseStream;
End;
Function TFileBuffer.OpenStream (FN: String; OpenType: TFileBufferOpenType; OpenMode: Byte) : Boolean;
Begin
Result := False;
If IsOpened Then CloseStream;
Assign (InFile, FN);
Case OpenType of
fmOpen : If Not ioReset (InFile, 1, OpenMode) Then Exit;
fmOpenCreate : If Not ioReset (InFile, 1, OpenMode) Then
If Not FileExist(FN) Then Begin
If Not ioReWrite (InFile, 1, OpenMode) Then Exit;
End Else
Exit;
fmCreate : If Not ioReWrite (InFile, 1, OpenMode) Then Exit;
End;
GetMem (Buffer, BufSize);
FillBuffer;
BufDirty := False;
IsOpened := True;
Result := True;
End;
Procedure TFileBuffer.CloseStream;
Begin
If IsOpened Then Begin
If BufDirty Then FlushBuffer;
System.Close (InFile);
End;
If Assigned(Buffer) Then Begin
FreeMem (Buffer, BufSize);
Buffer := NIL;
End;
IsOpened := False;
End;
Function TFileBuffer.FilePos : LongInt;
Begin
FilePos := BufStart + BufPos;
End;
Procedure TFileBuffer.FillBuffer;
Var
Start : LongInt;
Begin
Start := System.FilePos(InFile);
System.BlockRead (InFile, Buffer^[0], BufSize, BufRead);
BufStart := Start;
BufEnd := Start + BufRead;
BufPos := 0;
BufEOF := System.EOF(InFile);
End;
Function TFileBuffer.Read : Char;
Begin
If BufPos >= BufSize Then FillBuffer;
Read := Buffer^[BufPos];
Inc (BufPos);
End;
Procedure TFileBuffer.BlockWrite (Var Buf; Size: LongInt);
Var
Offset : LongInt;
Begin
If BufPos + Size > BufSize Then Begin
Offset := BufSize - BufPos;
If Offset > 0 Then
Move(Buf, Buffer^[BufPos], Offset);
FlushBuffer;
FillBuffer;
Move (TFileBufferRec(Buf)[Offset], Buffer^[BufPos], Size - Offset);
BufPos := BufPos + Size - Offset;
End Else Begin
Move (Buf, Buffer^[BufPos], Size);
Inc (BufPos, Size);
End;
If BufPos > BufEnd Then BufEnd := BufPos;
If BufPos > BufRead Then BufRead := BufPos;
BufDirty := True;
End;
Procedure TFileBuffer.BlockRead (Var Buf; Size: LongInt);
Var
Res : LongInt;
Begin
BlockRead(Buf, Size, Res);
End;
Procedure TFileBuffer.BlockRead (Var Buf; Size: LongInt; Var Count: LongInt);
Begin
If BufPos + Size >= BufRead Then Begin
If BufDirty Then FlushBuffer;
If Size > BufSize Then Size := BufSize;
System.Seek(InFile, BufStart + BufPos);
FillBuffer;
If BufRead < Size Then Size := BufRead;
End;
Move (Buffer^[BufPos], Buf, Size);
Inc (BufPos, Size);
Count := Size;
End;
Procedure TFileBuffer.Seek (FP : LongInt);
Begin
If (FP >= BufStart) and (FP < BufEnd) Then
BufPos := (BufEnd - (BufEnd - FP)) - BufStart
Else Begin
If BufDirty Then FlushBuffer;
System.Seek(InFile, FP);
FillBuffer;
End;
End;
Function TFileBuffer.EOF : Boolean;
Begin
EOF := (BufStart + BufPos >= BufEnd) and BufEOF;
End;
Function TFileBuffer.FileSize : LongInt;
Begin
FileSize := System.FileSize(InFile);
End;
Procedure TFileBuffer.FlushBuffer;
Var
Res : LongInt;
Begin
System.Seek (InFile, BufStart);
System.BlockWrite (InFile, Buffer^, BufRead, Res);
BufDirty := False;
End;
End. End.

View File

@ -196,7 +196,7 @@ Begin
Repeat Until Server <> NIL; // Synchronize with server class Repeat Until Server <> NIL; // Synchronize with server class
Repeat Until ServerStatus <> NIL; // Syncronize with status class Repeat Until ServerStatus <> NIL; // Syncronize with status class
Server.WaitInit(Port); Server.WaitInit('0.0.0.0', Port);
If Terminated Then Exit; If Terminated Then Exit;