亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sinfilememorystream.pas

?? SinStream源碼
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
      Position := Position + OldLen;                        //..定位到 Pos+OldLen
      GetSpace(BufLen - OldLen);                            //..獲取 BufLen - OldLen空間,此時pos不變
      Position := Position - OldLen;                        //..返回原Pos 即 pos-oldlen
      Write(Buf, BufLen);                                   //..數據
    end else begin                                          //..Pos后面的長度不夠 OldLen 那么就直接setsize就行了。
      Size := Position + BufLen;                            //..增加 Buflen-Size 長度
      Position := Size - BufLen;                            //..還原位置
      Write(Buf, BufLen);                                   //..寫數據
    end;
  end else begin                                            //..相等 直接寫入即可
    write(Buf, BufLen);
  end;
end;

function TSinFileStream.ModifyFromStream(OldLen: Dword; SM: TStream; BufLen: Dword): Boolean;
begin
  Result := (SM.Size >= BufLen + SM.Position) and (BufLen <> 0) and (SM.Position < SM.Size);
  if not Result then Exit;
  if OldLen > BufLen then begin
    Delete(OldLen - BufLen);
    Result := BufLen = CopyFrom(SM, BufLen);
  end else if OldLen < BufLen then begin
    if Size > OldLen + Position then begin
      Position := Position + OldLen;                        //..定位到 Pos+OldLen
      GetSpace(BufLen - OldLen);                            //..獲取 BufLen - OldLen空間,此時pos不變
      Position := Position - OldLen;                        //..返回原Pos 即 pos-oldlen
      Result := BufLen = CopyFrom(SM, BufLen);
    end else begin                                          //..Pos后面的長度不夠 OldLen 那么就直接setsize就行了。
      Size := Position + BufLen;                            //..增加 Buflen-Size 長度
      Position := Size - BufLen;                            //..還原位置
      Result := BufLen = CopyFrom(SM, BufLen);
    end;
  end else begin
    Result := BufLen = CopyFrom(SM, BufLen);
  end;
end;

{ TSinMemoryStream }

function TSinMemoryStream.CMS(CSize: Dword): DWord;
var
  MMS: TMemoryStream;
  IPos: Int64;
begin
  if (CSize = 0) or (CSize > Size - Position) then begin
    Result := 0;
    Exit;
  end;
  MMS := TMemoryStream.Create;
  IPos := Position;
  try
    with CMStream(MMS) do begin
      try
        CopyFrom(Self, CSize);
      finally
        Free;
      end;
    end;
    Position := IPos;                                       //... 回來
    GetSpace(C_Size + D_Size);
    Write(CStr, C_Size);
    Write(CSize, D_Size);
    MMS.Position := 0;
    if ModifyFromStream(CSize, MMS, MMS.Size) then
      Result := MMS.Size + C_Size + D_Size
    else Result := INVALID_VALUE;
  finally
    MMS.Free;
  end;
end;

function TSinMemoryStream.DCMS(DSize: Dword): DWord;
var
  MMS: TMemoryStream;
  IPos: Int64;
  ICount: Dword;
  Buffer: PChar;
  MStr: string[5];
begin
  if (DSize = 0) or (DSize > Size - Position) or (DSize < C_Size + D_Size) then begin
    Result := 0;
    Exit;
  end;
  IPos := Position;
  Read(MStr, C_Size);
  Read(ICount, D_Size);
  if (MStr <> CStr) then begin
    Result := INVALID_VALUE;
    Position := IPos;    
    Exit;
  end;
  MMS := TMemoryStream.Create;
  MMS.CopyFrom(Self, DSize - C_Size - D_Size);
  MMS.Position := 0;
  GetMem(Buffer, ICount);
  try
    with DCMStream(MMS) do begin
      try
        ReadBuffer(Buffer^, ICount);
      finally
        Free;
      end;
    end;
    MMS.Clear;
    MMS.Write(Buffer^, ICount);
    MMS.Position := 0;
    Position := IPos;                                       //... 回來
    if ModifyFromStream(DSize, MMS, MMS.Size) then
      Result := MMS.Size
    else Result := INVALID_VALUE;
  finally
    FreeMem(Buffer);
    MMS.Free;
  end;
end;

procedure TSinMemoryStream.Delete(OldLen: Dword);
var
  tmpBuf: array[0..$10000 - 1] of Byte;
  I, L, OldPos: Int64;
begin
  if Size < OldLen + Position then begin                    //.. 刪除的過長,直接SetSize即可
    Size := Position;
  end else begin                                            // ... 將后面的移動到前面... 然后 SetSize
    I := Position;
    OldPos := Position;
    repeat
      Position := I + OldLen;                               //.. 定位到后面部分
      L := Read(tmpBuf, SizeOf(tmpBuf));                    //.. 讀取到Buffer中
      Position := I;                                        //.. 定位到前面部分
      Write(tmpBuf, L);                                     //.. 寫入內容
      Inc(I, L);                                            //.. 移動前面部分的位置
    until L < SizeOf(tmpBuf);                               //.. 讀取的小于要讀取的大小說明已經讀取到結尾。
    Size := Size - OldLen;                                  //.. SetSize即可。
    Position := OldPos;
  end;
end;

procedure TSinMemoryStream.GetSpace(BufLen: Dword);
var
  tmpBuf: array[0..$10000 - 1] of Byte;                     // 64K 大小 這里有個棧的問題..
  I, L, OldPos: Int64;
begin
  if BufLen <= 0 then Exit;                                 //.. 簡單判斷下了..不然估計出錯
  I := Size;                                                //.. 保存原始大小
  OldPos := Position;                                       //.. 保存原始位置
  Size := Size + BufLen;                                    //.. 設置新大小..將前面的后移..倒著讀取..
  repeat
    if OldPos + BufLen <= I - SizeOf(tmpBuf) then
      L := SizeOf(tmpBuf)                                   //.. 讀取 tmpBuf長度
    else
      L := I - OldPos;                                      //.. 讀取剩余長度
    Position := I - L;                                      //.. 定位到要讀取的位置
    Read(tmpBuf, L);                                        //.. 讀取   L長度
    Position := I - L + BufLen;                             //.. 定位到原來讀取的位置
    Write(tmpBuf, L);                                       //.. 寫入   L長度
    I := I - L + BufLen;                                    //.. 向前移動..
  until L < SizeOf(tmpBuf);                                 //.. 返回到原始位置,然后寫入Buf內容...
  Position := OldPos;
end;

procedure TSinMemoryStream.Insert(const Buf; BufLen: Dword);
begin
  GetSpace(BufLen);
  Write(Buf, BufLen);
end;

function TSinMemoryStream.InsertFromStream(SM: TStream; BufLen: Dword): Boolean;
begin                                                       //.. 先定位  SM.Position 然后 BufLen應該<=SM.Size
  Result := BufLen = 0;
  if Result then Exit;                                      //.. 等于0 還有什么意義,退出..
  GetSpace(BufLen);
  SM.Position := 0;
  Result := BufLen = CopyFrom(SM, BufLen);
  if not Result then Delete(BufLen);
end;

procedure TSinMemoryStream.Modify(OldLen: Dword; const Buf; BufLen: Dword);
begin
  if OldLen > BufLen then begin                             //..先刪除差額,再寫入
    Delete(OldLen - BufLen);
    write(Buf, BufLen);
  end else if OldLen < BufLen then begin                    //..先增加差額,再寫入
    if Size > OldLen + Position then begin
      Position := Position + OldLen;                        //..定位到 Pos+OldLen
      GetSpace(BufLen - OldLen);                            //..獲取 BufLen - OldLen空間,此時pos不變
      Position := Position - OldLen;                        //..返回原Pos 即 pos-oldlen
      Write(Buf, BufLen);                                   //..數據
    end else begin                                          //..Pos后面的長度不夠 OldLen 那么就直接setsize就行了。
      Size := Position + BufLen;                            //..增加 Buflen-Size 長度
      Position := Size - BufLen;                            //..還原位置
      Write(Buf, BufLen);                                   //..寫數據
    end;
  end else begin                                            //..相等 直接寫入即可
    write(Buf, BufLen);
  end;
end;

function TSinMemoryStream.ModifyFromStream(OldLen: Dword; SM: TStream; BufLen: Dword): Boolean;
begin
  Result := (SM.Size >= BufLen + SM.Position) and (BufLen <> 0) and (SM.Position < SM.Size);
  if not Result then Exit;
  if OldLen > BufLen then begin
    Delete(OldLen - BufLen);
    Result := BufLen = CopyFrom(SM, BufLen);
  end else if OldLen < BufLen then begin
    if Size > OldLen + Position then begin
      Position := Position + OldLen;                        //..定位到 Pos+OldLen
      GetSpace(BufLen - OldLen);                            //..獲取 BufLen - OldLen空間,此時pos不變
      Position := Position - OldLen;                        //..返回原Pos 即 pos-oldlen
      Result := BufLen = CopyFrom(SM, BufLen);
    end else begin                                          //..Pos后面的長度不夠 OldLen 那么就直接setsize就行了。
      Size := Position + BufLen;                            //..增加 Buflen-Size 長度
      Position := Size - BufLen;                            //..還原位置
      Result := BufLen = CopyFrom(SM, BufLen);
    end;
  end else begin
    Result := BufLen = CopyFrom(SM, BufLen);
  end;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一二三四在线| 中文字幕欧美日本乱码一线二线| www.久久久久久久久| 激情五月婷婷综合| 国产一区二三区好的| 狠狠网亚洲精品| 国产成人午夜高潮毛片| 国产精品性做久久久久久| 黑人精品欧美一区二区蜜桃| 国产在线精品免费| 国产激情一区二区三区| 成人午夜精品一区二区三区| 成人黄动漫网站免费app| aaa欧美色吧激情视频| 91社区在线播放| 在线观看日韩毛片| 欧美一区二区视频在线观看 | 日韩精品一级中文字幕精品视频免费观看 | 日韩黄色一级片| 午夜精品久久一牛影视| 美女视频一区二区| 成人免费的视频| 99国产欧美另类久久久精品| 欧美丝袜自拍制服另类| 欧美成人欧美edvon| 国产精品免费看片| 亚洲女爱视频在线| 日韩不卡免费视频| 成人av综合一区| 欧美性xxxxxxxx| 久久久不卡网国产精品二区| 亚洲色图制服诱惑| 老司机一区二区| 99久久久无码国产精品| 日韩一级二级三级| 亚洲欧洲av在线| 美女一区二区三区在线观看| 不卡的av在线播放| 日韩一二三四区| 亚洲美女屁股眼交3| 国产一区在线视频| 欧美日韩国产一级二级| 国产视频一区在线播放| 五月天亚洲婷婷| 成人精品免费网站| 精品剧情在线观看| 亚洲一二三级电影| 国产suv精品一区二区6| 欧美一级日韩不卡播放免费| 最新日韩在线视频| 国产一区二区在线影院| 欧美日韩国产一二三| 亚洲色图视频网站| 国产成人av在线影院| 日韩视频中午一区| 亚洲成av人在线观看| 99久久婷婷国产综合精品电影| 日韩精品一区二区三区视频播放| 亚洲精品中文字幕在线观看| 国产白丝精品91爽爽久久| 日韩欧美久久久| 午夜精品一区在线观看| 日本韩国欧美一区二区三区| 久久久精品日韩欧美| 久久国内精品自在自线400部| 欧美视频一区二区三区在线观看| 综合激情成人伊人| 99久久伊人精品| 国产精品久久毛片a| 91久久人澡人人添人人爽欧美| 国产精品午夜在线| 粉嫩av一区二区三区| 久久久久久久久久久黄色| 九九精品视频在线看| 日韩一区二区高清| 美女网站色91| 久久久久久黄色| 国产成人精品一区二区三区网站观看| 久久亚洲影视婷婷| 国产精品一区一区三区| 久久久久久99久久久精品网站| 国产在线精品免费| 欧美激情在线一区二区三区| 风间由美一区二区三区在线观看 | 91精品国产91久久久久久最新毛片| 亚洲精品日韩专区silk| 色视频一区二区| 亚洲成av人片观看| 精品剧情在线观看| 懂色中文一区二区在线播放| 亚洲色图制服丝袜| 欧美猛男超大videosgay| 亚洲妇熟xx妇色黄| 日韩欧美www| 国产精品亚洲一区二区三区在线 | 日韩影视精彩在线| 26uuuu精品一区二区| 国产成人啪免费观看软件| 国产亚洲美州欧州综合国| 欧美色综合网站| 麻豆精品新av中文字幕| 国产精品久线观看视频| 欧美综合天天夜夜久久| 精品写真视频在线观看| 欧美国产国产综合| 欧美日韩大陆一区二区| 国产剧情在线观看一区二区| 亚洲欧美怡红院| 欧美精品一二三| 成人精品免费视频| 午夜欧美2019年伦理| 久久精品男人的天堂| 欧美日韩一区二区电影| 国产精品91xxx| 一区二区三区高清不卡| 精品捆绑美女sm三区| 91福利精品第一导航| 国产成人在线电影| 水蜜桃久久夜色精品一区的特点| 久久久久久久综合日本| 欧美日韩情趣电影| 成人精品视频一区二区三区尤物| 日韩av电影一区| 亚洲一级二级三级在线免费观看| 欧美国产欧美综合| 日韩欧美一级二级三级久久久| 91麻豆视频网站| 懂色av一区二区三区免费看| 日日夜夜一区二区| 亚洲激情男女视频| 中文字幕日本不卡| 欧美精品一区二区不卡| 91麻豆精品国产91久久久| 91在线视频18| 国产成人av资源| 色欧美片视频在线观看在线视频| 国产在线一区二区| 老司机午夜精品99久久| 日本成人在线看| 亚洲国产美国国产综合一区二区| 国产精品欧美经典| 欧美激情一区二区三区不卡| 日韩精品专区在线| 在线播放国产精品二区一二区四区 | a在线播放不卡| 国产精品亚洲综合一区在线观看| 九九精品一区二区| 久久精品理论片| 麻豆精品视频在线| 久久9热精品视频| 久久99精品视频| 久久国产精品免费| 麻豆视频观看网址久久| 麻豆视频观看网址久久| 久久国产日韩欧美精品| 久久99国产精品久久99 | 亚洲另类中文字| 亚洲欧美日韩国产手机在线| 亚洲人午夜精品天堂一二香蕉| 国产精品对白交换视频| 亚洲女同一区二区| 亚洲欧美韩国综合色| 亚洲精品国产无天堂网2021| 亚洲一区视频在线观看视频| 亚洲第一福利一区| 日本午夜一区二区| 精品午夜一区二区三区在线观看| 国产一区二区调教| 成人动漫一区二区在线| 在线国产电影不卡| 91精品国产综合久久国产大片| 欧美成人一区二区| 久久精品在这里| 亚洲三级在线播放| 秋霞国产午夜精品免费视频| 国产一区二区三区久久悠悠色av| 99久久国产综合精品女不卡| 欧美日韩一区二区三区四区五区| 91精品国产全国免费观看| 久久久久久久久久久久久久久99 | 国产美女在线精品| 3d成人动漫网站| 国产亚洲短视频| 亚洲精品国产视频| 日本中文一区二区三区| 高清国产午夜精品久久久久久| 欧美亚洲国产怡红院影院| 欧美一级高清大全免费观看| 国产精品毛片久久久久久| 亚洲成av人片一区二区梦乃 | 亚洲国产成人tv| 麻豆精品一二三| 日本久久一区二区| 欧美成人r级一区二区三区| 亚洲猫色日本管| 国产综合成人久久大片91| 在线亚洲一区观看| 国产欧美精品一区二区色综合朱莉| 亚洲精品国产无套在线观| 国产在线视频一区二区三区|