加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 带偏移量的TFileStream

发布时间:2020-12-15 04:05:02 所属栏目:大数据 来源:网络整理
导读:我需要扩展TFileStream,以便它可以处理不是来自0偏移量的文件,而是来自用户定义的偏移量.我的意思是它必须将用户定义的偏移解释为流开始.我的代码是: type TSuFileStream = class(TFileStream) protected FOffset : int64; procedure SetOffset(Offset : in
我需要扩展TFileStream,以便它可以处理不是来自0偏移量的文件,而是来自用户定义的偏移量.我的意思是它必须将用户定义的偏移解释为流开始.我的代码是:
type
  TSuFileStream = class(TFileStream)
  protected
    FOffset : int64;

    procedure SetOffset(Offset : int64);

    procedure SetSize(NewSize: Longint); override;
    procedure SetSize(const NewSize: Int64); override;
  public
    constructor Create(const AFileName: string; Mode: Word); overload;
    constructor Create(const AFileName: string; Mode: Word; Rights: Cardinal); overload;

    function Seek(Offset: Longint; Origin: Word): Longint; override;
    function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;

    property Offset : int64 read FOffset write SetOffset;
  end;
...
constructor TSuFileStream.Create(const AFileName: string; Mode: Word);
begin
  inherited Create(AFileName,Mode);
  FOffset := 0;
end;

constructor TSuFileStream.Create(const AFileName: string; Mode: Word; Rights: Cardinal);
begin
  inherited Create(AFileName,Mode,Rights);
  FOffset := 0;
end;

procedure TSuFileStream.SetOffset(Offset : int64);
begin
  FOffset := Offset;
  inherited Seek(FOffset,soBeginning);
end;

procedure TSuFileStream.SetSize(NewSize: Longint);
begin
  inherited SetSize(FOffset + NewSize);
end;

procedure TSuFileStream.SetSize(const NewSize: Int64);
begin
  inherited SetSize(FOffset + NewSize);
end;

function TSuFileStream.Seek(Offset: Longint; Origin: Word): Longint;
begin
  Result := Seek(Int64(Offset),TSeekOrigin(Origin));
end;

function TSuFileStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
begin
  case Origin of
    soBeginning: Result := inherited Seek(FOffset + Offset,soBeginning) - FOffset;
    soCurrent: Result := inherited Seek(Offset,soCurrent) - FOffset;
    soEnd: Result := inherited Seek(Offset,soEnd) - FOffset;
  end;
end;

但它不起作用.问题在于寻求功能,但我不知道为什么.当我将这样的流传递给第三方组件时,它仅在TSuFileStream.Offset:= 0时起作用;

解决方法

使用 TGpStreamWindow,可在 my web和 Google Code获得.

用法:

var
  offsetStream: TGpStreamWindow;

begin
  offsetStream := TGpStreamWindow.Create(originalStream,initialOffset,originalStream.Size - 1);
  try
    DoSomethingWith(offsetStream);
    offsetStream.SetWindow(anotherInitialOffset,originalStream.Size - 1);
    DoSomethingElseWith(offsetStream);
  finally FreeAndNil(offsetStream); end;
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读