Zitat von
shmia:
Die beiden Aufrufe für CreateFile() wären noch zu programmieren. Das wird eine kleine Parameterschlacht, weil es hier so viele Möglichkeiten gibt.
Hallo Leute, ich hab' mal versucht, diesen Vorschlag (Ableiten von THandleStream) etwas zu konkretisieren. Ich würde ich mir das ungefähr so vorstellen:
Delphi-Quellcode:
program a;
uses
Classes, Windows, SysUtils, RTLConsts;
type
TSeqFileStream=class(THandleStream)
public
constructor Create(const FileName: string; Mode: Word);
destructor Destroy; override;
end;
constructor TSeqFileStream.Create(const FileName: string; Mode: Word);
const
AccessMode: array[0..2] of LongWord=
(GENERIC_READ,GENERIC_WRITE,GENERIC_READ or GENERIC_WRITE);
ShareMode: array[0..4] of LongWord=
(0,0,FILE_SHARE_READ,FILE_SHARE_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE);
var
fo:integer;
begin
if Mode=fmCreate then
begin
fo:=CreateFile(PChar(FileName),GENERIC_READ or GENERIC_WRITE, 0, nil,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN {<--!!}, 0);
inherited Create(fo);
if FHandle<0 then raise EFCreateError.CreateResFmt(@SFCreateError, [FileName]);
end
else
begin
fo:=-1;
if ((Mode and 3)<=fmOpenReadWrite)
and ((Mode and $F0)<=fmShareDenyNone) then
fo:=CreateFile(PChar(FileName),
AccessMode[Mode and 3], ShareMode[(Mode and $F0) shr 4], nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN {<--!!}, 0);
inherited Create(fo);
if FHandle<0 then raise EFOpenError.CreateResFmt(@SFOpenError, [FileName])
end
end;
destructor TSeqFileStream.Destroy;
begin
if FHandle>=0 then FileClose(FHandle);
inherited Destroy;
end;
end.
Den Parameterkrieg hab' ich mich mal an TFileStream gehalten und FILE_FLAG_SEQUENTIAL_SCAN hinzugefügt, aber es ist wirklich wild!! Eine simples "case Mode of" zur Parameterkonvertierung hätte ich eigentlich schöner gefunden... Leider komm' ich heute nicht mehr zum Testen.
Viele Grüße,
Helmut