Advertisement
prog

xfile.pas

Aug 15th, 2010
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.00 KB | None | 0 0
  1. unit xfile;
  2.  
  3. {$I cubix.inc}
  4.  
  5. interface
  6.  
  7. uses
  8.   Windows,
  9.   Messages,
  10.   WinSock,
  11.   SysUtils,
  12.   Classes,
  13.   fifostream;
  14.  
  15. const
  16.   MAX_BUFFER = 1024 * 4;
  17.  
  18. type
  19.   TFileReadEvent = procedure(Sender: TObject; const Buffer; Count: Integer) of object;
  20.  
  21.   TAsyncFile = class
  22.   private
  23.     FHandle: THandle;
  24.     FOverlapped: TOverlapped;
  25.     FBuffer: PByteArray;
  26.     FOnRead: TFileReadEvent;
  27.     FEof: Boolean;
  28.     function ProcessIo: Boolean;
  29.     procedure DoOnRead(Count: Integer);
  30.     function GetOpen: Boolean;
  31.   public
  32.     constructor Create(Filename: string; FileMode: Integer = fmOpenRead; BufferSize: Integer = MAX_BUFFER);
  33.     destructor Destroy; override;
  34.     procedure BeginRead;
  35.     procedure BeginWrite(var Buf; Size: Integer);
  36.     property OnRead: TFileReadEvent read FOnRead write FOnRead;
  37.     property Eof: Boolean read FEof;
  38.     property Open: Boolean read GetOpen;
  39.   end;
  40.  
  41. function ProcessFiles: Boolean;
  42.  
  43. implementation
  44.  
  45. var
  46.   Files: TList;
  47.  
  48. function ProcessFiles: Boolean;
  49. var
  50.   i: Integer;
  51.   AsyncFile: TAsyncFile;
  52. begin
  53.   Result := False;
  54.   for i := Files.Count - 1 downto 0 do
  55.   begin
  56.     AsyncFile := TAsyncFile(Files[i]);
  57.     Result := AsyncFile.ProcessIo or Result;
  58.   end;
  59. end;
  60.  
  61. procedure Cleanup;
  62. var
  63.   i: Integer;
  64.   AsyncFile: TAsyncFile;
  65. begin
  66.   for i := Files.Count - 1 downto 0 do
  67.   begin
  68.     AsyncFile := TAsyncFile(Files[i]);
  69.     if AsyncFile.Open then
  70.     begin
  71.       AsyncFile.Free;
  72.     end;
  73.   end;
  74.   Files.Free;
  75. end;
  76.  
  77. { TAsyncFile }
  78.  
  79. constructor TAsyncFile.Create(Filename: string; FileMode: Integer; BufferSize: Integer);
  80. begin
  81.   GetMem(FBuffer, BufferSize);
  82.   FHandle := FileOpen(Filename, FileMode);
  83.   FillMemory(@FOverlapped, SizeOf(FOverlapped), 0);
  84.   FOverlapped.hEvent := CreateEvent(nil, True, False, nil);
  85.   Files.Add(Self);
  86. end;
  87.  
  88. destructor TAsyncFile.Destroy;
  89. begin
  90.   FreeMem(FBuffer);
  91.   FileClose(FHandle);
  92.   CloseHandle(FOverlapped.hEvent);
  93.   Files.Remove(Self);
  94.   inherited;
  95. end;
  96.  
  97. function TAsyncFile.ProcessIo: Boolean;
  98. var
  99.   ReadCount: Cardinal;
  100. begin
  101.   Result := GetOverlappedResult(FHandle, FOverlapped, ReadCount, False);
  102.   if Result then
  103.   begin
  104.     DoOnRead(ReadCount);
  105.   end
  106.   else if GetLastError() = ERROR_HANDLE_EOF then
  107.   begin
  108.     FEof := True;
  109.   end;
  110. end;
  111.  
  112. procedure TAsyncFile.BeginRead;
  113. var
  114.   ReadResult: Boolean;
  115.   ReadCount: Cardinal;
  116. begin
  117.   ReadCount := 0;
  118.   ReadResult := ReadFile(FHandle, FBuffer, SizeOf(FBuffer), ReadCount, @FOverlapped);
  119.   if ReadResult then
  120.   begin
  121.     FEof := False;
  122.     DoOnRead(ReadCount);
  123.   end
  124.   else if GetLastError() = ERROR_HANDLE_EOF then
  125.   begin
  126.     FEof := True;
  127.   end;
  128. end;
  129.  
  130. procedure TAsyncFile.BeginWrite(var Buf; Size: Integer);
  131. begin
  132.  
  133. end;
  134.  
  135. procedure TAsyncFile.DoOnRead(Count: Integer);
  136. begin
  137.   if Assigned(FOnRead) then
  138.   begin
  139.     FOnRead(Self, FBuffer, Count);
  140.   end;
  141. end;
  142.  
  143. function TAsyncFile.GetOpen: Boolean;
  144. begin
  145.   Result := FHandle >= 0;
  146. end;
  147.  
  148. initialization
  149.   Files := Tlist.Create;
  150.  
  151. finalization
  152.   Cleanup;
  153.  
  154. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement